C 如何退出a";“边做边做”;环
我想知道在不使用EOF或其他号码的情况下退出do-while循环的最佳方式是什么。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("
是否有方法输入字符以便用户可以退出循环?
我尝试过编写
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循环的最佳方法是使条件失败。请重新表述您的问题,解释为什么这不是您问题的解决方案。提供一些示例代码会很有帮助,以便您和潜在的回答者在讨论的时候可以看到同样的东西。这一点特别重要,因为你在问题中暗示了一些结构,哪些是怎样的