我想知道在不使用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;
}
}
答案 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
}
}
这些解决方案都不是循环的,但是您应该能够弄清楚如何将它们集成到循环结构中。