scanf读取前一行而不是获取新行

时间:2013-11-20 12:19:12

标签: c scanf

我有以下代码:

#include <stdio.h>
int opt;
scanf("%d",&opt);
while(opt!=0)
{
    switch(opt)
    {
    case 1:func1();
        break;
    case 2:func2();
        break;
    case 3:return 0;
    }
    printf("\n");
    scanf("%d",&opt);
}

我希望计算机每次从用户那里得到不同的数字(1或2或3),并且每次计算机都会运行单独的功能。但是当我按下2时,func2获得3个整数并在屏幕上以新的行打印字符。计算机读取它们而不是读取下一个输入(1或2或3)。我该如何解决?

编辑:问题仅在特定输入(我构建程序转换基础)后才会上升。

输入:

2

10

26

1z2

输出:

ERROR

INPUT:

2

38762

10

UNWANTED OUTPUT:

201222

我不确定计算机扫描用于打印最后一个不需要的输出的第二个数字。

4 个答案:

答案 0 :(得分:1)

你的第二个scanf应该被阻止,但这不是因为第一次调用后输入缓冲区不是空的!这就是为什么它总是返回前一个值并无限循环。 请改为使用fgetssscanf的组合。

同时检查:http://c-faq.com/stdio/scanfprobs.html

答案 1 :(得分:1)

如果您的功能在其中使用scanf()来询问字符,或者您正在使用fgets()来读取一行,则可能会发现scanf() / fgets()确实在运行没有用户输入。这是因为您在scanf("%d",&opt);处输入的换行符仍然存在,并用作下一个scanf()/fgets()的新输入。您必须通过发出

来删除它
fflush (stdin);

在致电scanf()fgets()

之前

答案 2 :(得分:1)

你可能需要这样的东西..

#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
    int opt;

    do{
        printf("Enter the option\n");
        scanf("%d",&opt);
        switch(opt){
            case 1: func1();
                    break;
            case 2: func2();
                    break;
            case 3: 
                    return 0;
        }

    }while(opt != 3);

    return 0;
}

答案 3 :(得分:0)

hhachem在评论中指出您未从while循环中退出的一个问题。
您可以通过执行来解决此问题(因为您只想在按3后退出):

 while(1)
{
    switch(1)
    {
        case 1:func1();
            break;
        case 2:func2();
            break;
        case 3: exit(0);
    }
    printf("\n");
    scanf("%d",&opt);
}  

测试程序:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int opt;
    scanf("%d",&opt);
    while(1)
    {
        switch(opt)
        {
            case 1:printf("1");
                   break;
            case 2:printf("2");
                   break;
            case 3:exit(0);
         }

         printf("\n");
         scanf("%d",&opt);
    }

    return 0;
}  

请参阅output