C 如何退出a";“边做边做”;环

C 如何退出a";“边做边做”;环,c,C,我想知道在不使用EOF或其他号码的情况下退出do-while循环的最佳方式是什么。 是否有方法输入字符以便用户可以退出循环? 我尝试过编写printf(“输入一个数字('x'退出):,但它不起作用。 你知道另一种方法吗? 我不能使用EOF,因为否则程序不会将-1计数为一个数字,而数字-1将专门用于退出循环 #include <stdio.h> int even(int number); int main(){ int n; do{ printf("

我想知道在不使用EOF或其他号码的情况下退出do-while循环的最佳方式是什么。
是否有方法输入字符以便用户可以退出循环?
我尝试过编写
printf(“输入一个数字('x'退出):
,但它不起作用。
你知道另一种方法吗?
我不能使用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;
    }
}
#包括
整数偶数(整数);
int main(){
int n;
做{
printf(“输入一个整数(x终止):”;
scanf(“%d”和“&n”);
如果(n=='x'){
打破
}
printf(“%d\n”,偶数(n));
}而(n!='x');
返回0;
}
整数偶数(整数){
如果(数字%2==0){
返回1;
}否则{
返回0;
}
}

保留
scanf()中的返回值

 int scanreturn=0;
 /* ... */
 scanreturn= scanf("%d", &n);
然后将此作为do while的条件

}while (scanreturn == 1);
这是因为
scanf()
返回成功扫描的输入字段数。
只要成功扫描一个整数,该值将为1。
当输入“x”或任何看起来不像整数的内容时,循环将结束

比较

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

或引用C标准7.21.6.4,例如

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


保留
scanf()
中的返回值,如中所示

 int scanreturn=0;
 /* ... */
 scanreturn= scanf("%d", &n);
然后将此作为do while的条件

}while (scanreturn == 1);
这是因为
scanf()
返回成功扫描的输入字段数。
只要成功扫描一个整数,该值将为1。
当输入“x”或任何看起来不像整数的内容时,循环将结束

比较

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

或引用C标准7.21.6.4,例如

…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');
返回成功读取的项目数

您也可以这样做:

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');

你有两种方法可以做到这一点

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
  }
}
#包括//用于strtol
#包含//用于isspace
#定义最大输入长度13//足够10位十进制数字加上符号加上换行符加上字符串终止符
字符输入[最大输入长度+1];
printf(“给我一个数字:”);
if(fgets(输入,输入大小,标准输入))
{
char*chk;//将指向输入中*不是*的第一个字符
//十进制数字
int tmp=strtod(输入和chk,10);
如果(!isspace(*chk)&&*chk!=0)
{
//输入不是有效的十进制整数
}
其他的
{
n=tmp;//在知道有有效输入之前,不要分配n
}
}
其他的
{
if(feof(stdin))
{
//在输入流上发出文件结束信号
}
其他的
{
//输入时出错
}
}

这两种解决方案都不在循环中,但您应该能够找出如何将它们集成到循环结构中。

您有两种方法可以实现这一点

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
  }
}
#包括//用于strtol
#包含//用于isspace
#定义最大输入长度13//足够10位十进制数字加上符号加上换行符加上字符串终止符
字符输入[最大输入长度+1];
printf(“给我一个数字:”);
if(fgets(输入,输入大小,标准输入))
{
char*chk;//将指向输入中*不是*的第一个字符
//十进制数字
int tmp=strtod(输入和chk,10);
如果(!isspace(*chk)&&*chk!=0)
{
//输入不是有效的十进制整数
}
其他的
{
n=tmp;//在知道有有效输入之前,不要分配n
}
}
其他的
{
if(feof(stdin))
{
//在输入流上发出文件结束信号
}
其他的
{
//输入时出错
}
}

这两种解决方案都不在循环中,但您应该能够找出如何将它们集成到循环结构中。

退出dowhile循环的最佳方法是使条件失败。请重新表述您的问题,解释为什么这不是您问题的解决方案。提供一些示例代码会很有帮助,以便您和潜在的回答者在讨论的时候可以看到同样的东西。这一点特别重要,因为你在问题中暗示了一些结构,哪些是怎样的