如何退出“执行时”循环?

时间:2018-08-20 19:30:46

标签: c

我想知道在不使用EOF或其他数字的情况下退出do-while循环的最佳方法是什么。
有没有一种方法可以输入字符,以便用户退出循环?
我尝试编写printf("Enter a number ('x' to exit):,但没有用。
你知道另一种方法吗?
我不能使用EOF,因为否则程序将不会将-1视为一个数字,而数字-1将专门用于退出循环。

#include <stdio.h>

int even(int number);

int main(){
    int n;
    do{
        printf("Enter an integer (x to terminate): ");
        scanf("%d", &n);
        if(n=='x'){
            break;
        }
        printf("%d\n", even(n));
    }while(n!='x');
    return 0;
}

int even(int number){
    if(number%2==0){
        return 1;
    }else{
        return 0;
    }
}

3 个答案:

答案 0 :(得分:2)

与{p>一样,保留scanf()的返回值

 int scanreturn=0;
 /* ... */
 scanreturn= scanf("%d", &n);

然后将其用作执行条件

}while (scanreturn == 1);

之所以有效,是因为scanf()返回成功扫描的输入字段的数量。
只要成功扫描了一个整数,该值为1。
输入“ x”或任何看起来不像整数的东西,循环将结束。

比较https://en.cppreference.com/w/c/io/fscanf

  

返回值:
   成功分配的接收参数的数量(可以是   如果在第一次接收之前发生匹配失败,则为零   参数已分配),如果输入失败发生在EOF之前,则返回EOF   分配了第一个接收参数。

或引用C标准7.21.6.4,例如http://port70.net/~nsz/c/c11/n1570.html#7.21.6.4

  

... scanf函数返回分配的输入项的数量,如果早期匹配失败,该数量可能少于提供的数量,甚至为零。

答案 1 :(得分:0)

int n, val=1;

do{
    printf("Enter an integer (x to terminate): ");
    val=scanf("%d", &n);
    printf("%d\n", even(n));
}while(val!=0);

Scanf()返回成功读取的项目数。

您也可以这样做:

int n;
char c[25];

do{
    printf("Enter an integer (x to terminate): ");
    scanf("%24s", c);
    printf("%d\n", even(atoi(c)));
}while(c[0]!='x');

答案 2 :(得分:0)

您可以通过以下两种方法进行操作。

scanf返回成功的转换和分配的次数。如果您期望输入一个十进制整数,并且第一眼看到的是'x',那么您将出现匹配失败,并且scanf将返回0。因此,您可以做类似的事情

printf( "Gimme a number: " );
if ( scanf( "%d", &n ) == 1 )
{
  // do something with n
}
else
{
  if ( !feof( stdin ) )
  {
    // user entered something that isn't a decimal digit
  }
  else
  {
    // EOF signaled on input stream (ctrl-D, ctrl-Z, EOF from redirected file, etc.).
  }
}

问题在于,这会在流中留下无与伦比的输入,以阻塞下一个读取。 IMO的一种更好的解决方案是将所有内容都读取为文本,然后使用strtol将文本转换为整数。

#include <stdlib.h> // for strtol
#include <ctype.h>  // for isspace

#define MAX_INPUT_LENTH 13 // enough for 10 decimal digits plus sign plus newline plus string terminator

char input[MAX_INPUT_LENGTH+1];

printf( "Gimme a number: " );
if ( fgets( input, sizeof input, stdin ) )
{
  char *chk; // will point to first character in input that *isn't* a
             // decimal digit
  int tmp = strtod( input, &chk, 10 );
  if ( !isspace( *chk ) && *chk != 0 )
  {
    // input is not a valid decimal integer
  }
  else
  {
    n = tmp; // don't assign n until you know you have valid input
  }
}
else
{
  if ( feof( stdin ) )
  {
    // end-of-file signaled on input stream
  }
  else
  {
    // error during input
  }
}

这些解决方案都不是循环的,但是您应该能够弄清楚如何将它们集成到循环结构中。