如何制作一个忽略C中字母的循环?

时间:2014-09-14 22:19:56

标签: c

C noob在这里。只是忽略标题找不到更好的标题:D

void displayMainMenu() {
int choice;
do {
    printf("1. Start the game.\n");
    printf("2. Recruit troops.\n");
    printf("3. Exit.\n");
    scanf("%d", &choice);
} while (choice < 1 || choice > 3);
switch (choice) {
    case(1) : printf("...");
    break;
    case(2) : printf("...");
    break;
    case(3) : printf("...");
    exit(0);
    break;
}
}

当我输入一个超出范围的数字时,它会完全循环,但是当我输入一个字母或一个符号时,它会进入无限循环。我希望我的程序是完美的,即使我是初学者,所以我想知道如何实现这一目标?我应该使用ASCII还是有完全不同的方法来做这种事情。

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:2)

为什么它变得无限的原因:scanf拒绝"%d"的字母并且没有任何内容可读。请注意,没有消耗输入缓冲区中的字母,因此下次调用scanf时它会再次失败。

要详细了解相关信息,请检查scanf0EOF的返回值,无需读取,1读取1个项目。

因此解决方案是检查scanf的返回值并跳出循环。

EDITED:

添加了一个例子:

do {
    printf("1. Start the game.\n");
    printf("2. Recruit troops.\n");
    printf("3. Exit.\n");
    int item_got = scanf("%d", &choice);
    if (item_got != 1)
    {
        choice = -1; // mark it.
        break;
    }
} while (choice < 1 || choice > 3);

答案 1 :(得分:2)

scanf("%d", &choice);
scanf("%*[^\n]%*c");//add 

答案 2 :(得分:0)

如果无法读取格式化输入,则scanf()函数返回0。因此,如果您想在用户输入此类输入时退出,则可以编写:

if(!scanf("%d", &choice))break;