我尝试做的循环有问题。 我的代码将提示用户输入值1,2以执行某些操作,然后输出3以退出。 当我尝试添加对输入的检查时,如果它不是整数,则循环将仅循环不停止。 我想知道我的if(!输入)是否在这里被错误地使用了? 有人可以指导我吗? 感谢。
do
{
printf ("Input no\n");
scanf ("%d", &input);
if (input)
{
if ( input == 1)
{
printf ("do wat u wan if is 1\n");
}
if ( input == 2)
{
printf ("do wat u wan if is 2\n");
}
}
else if (!input)
{
printf("error\n");
}
}
while(input !=3 );
if ( input == 3)
{
printf ("exiting\n");
}
答案 0 :(得分:1)
如果scanf()无法正确读取,则必须清除输入缓冲区。
int res = scanf ("%d", &input);
if( res == 0 )
{
int clear = 0 ;
while( ( clear = getchar() ) != EOF && clear != '\n') ;
}
在这种情况下,如果res不是1,则scanf没有读取整数,并且在stdin中有一些字符。
在将输入传递给scanf()之前,还要将输入设置为0,以便if语句可以正确处理结果。
答案 1 :(得分:1)
do
{
printf ("Input no\n");
if(scanf ("%d", &input)==1) //if `scanf` is successfull
{
if ( input == 1)
{
printf ("do wat u wan if is 1\n");
}
else if ( input == 2)
{
printf ("do wat u wan if is 2\n");
}
}else //scanning an integer failed
{
printf("Invalid input(non-numeric value entered). Breaking loop...\n");
scanf("%*s"); //discarding previous input
break; //or use `continue;` for looping once more
}
}
while(input !=3 );
printf ("exited loop\n");
上面的代码会做你想要的,我也从中删除了不必要的东西。
答案 2 :(得分:0)
这里的问题不是你的循环,而是你对scanf的调用中的格式说明符,如果你用%d调用scanf它需要一个整数,如果它没有收到整数,它就不会满意。尝试使用%c调用scanf并将读取的字符转换为相应的整数值,这可以解决您的问题,并且可以由您进行管理。
答案 3 :(得分:0)
将代码的第一部分更改为:
...
int input;
do
{
char line[256];
printf("Input no\n");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &input);
if (input)
...
从未使用scanf
!这几乎无法使用。它可能在编译器之间缺乏一致的行为。
问题是:如果scanf()
遇到根据格式%d
无法使用的项目,则该项目将永久保留在输入缓冲区中。您可以使用%s
并在之后进行转换来避免这种情况。更好:在线路输入使用行读取(gets()/fgets()
)
如果要检测传入字符串中的数字/非数字,可以使用isdigit()
中的<ctype.h>
函数。您的代码最终将采用以下格式:
int input;
do {
char line[256];
printf("Input no\n");
fgets(line, sizeof(line), stdin);
if (isdigit(line[0])) { /* check if first char is a number */
sscanf(line, "%d", &input); /* scan this number from string */
if (input == 1) {
printf("do wat u wan if is 1\n");
}
if (input == 2) {
printf("do wat u wan if is 2\n");
}
}
else {
input = 0; /* reset input to any value != 3 */
printf("error\n");
}
} while (input != 3);
不要忘记#include <ctype.h>
。