做1-4菜单循环不断重复非数字输入

时间:2018-04-16 00:54:36

标签: c loops do-while

我遇到这个问题时菜单循环是一个更大的编程问题的一部分,它不断重复任何非数字输入。我怎么能阻止这个? 任何帮助都会非常感谢!

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main (void)
{
    int option = 0; 
    do
    {
        printf("--- Menu---\n1) Option 1\n2) Option 2\n3) Option 3\n4) Exit\nPlease select an option (1, 2, 3, or 4):");
        if ((scanf("%d", &option) != 1))
        {
            printf(">Invalid option! ");
        }

        switch(option)
        {
            case 1: printf(" 1 \n");
            break ;
            case 2:printf(" 2 \n");
            break ;
            case 3: printf(" 3 \n");
            break ;
            case 4: printf(" The program has terminated\n"); 
            break;
        }
    }while(option != 4);
    return 0;
}

1 个答案:

答案 0 :(得分:3)

它不断重复的原因是因为

scanf("%d", &option)
输入非数字输入时,

将返回0。 scanf失败但确实失败了 不清理输入缓冲区,这意味着非数字输入将保留 输入缓冲区。

因为你没有在错误中退出循环

if ((scanf("%d", &option) != 1))
{
    printf(">Invalid option! ");
}

scanf将再次尝试阅读stdin。但由于以前的失败, 输入缓冲区仍将具有最后的非数字输入,scanf将失败 再一次,等等。因此它不断重复。

你必须在循环中出错:

if ((scanf("%d", &option) != 1))
{
    printf(">Invalid option! ");
    break;
}

将结束该计划。但是,如果你不希望程序结束但打印 菜单并等待用户输入,然后你必须&#34;清洁&#34;输入缓冲区。您 可以使用这个功能:

void clean_stdin(void)
{
    int c;
    while((c = getchar()) != '\n' && c != EOF);
}

然后

if ((scanf("%d", &option) != 1))
{
    printf(">Invalid option! ");
    clean_stdin();
    continue; // to skip the rest of the loop
              // and start the loop again
}