C编程循环逻辑错误

时间:2014-10-22 16:24:19

标签: c

我尝试做的循环有问题。 我的代码将提示用户输入值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");
}

4 个答案:

答案 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>