Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成忽略C中字母的循环?_C - Fatal编程技术网

如何生成忽略C中字母的循环?

如何生成忽略C中字母的循环?,c,C,这里没有。忽略标题,找不到更好的标题: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) {

这里没有。忽略标题,找不到更好的标题: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;
}
}
void displaymain菜单(){
智力选择;
做{
printf(“1.开始游戏。\n”);
printf(“2.招募部队。\n”);
printf(“3.退出。\n”);
scanf(“%d”,选择(&C);
}而(选择<1 | |选择>3);
开关(选择){
案例(1):printf(“…”);
打破
案例(2):printf(“…”);
打破
案例(3):printf(“…”);
出口(0);
打破
}
}
当我输入一个超出范围的数字时,它会很好地循环,但当我输入一个字母或符号时,它会进入一个无限循环。我希望我的程序是完美的,即使我是一个初学者,所以我想知道我如何才能做到这一点?我应该使用ASCII还是有完全不同的方法来做这类事情


非常感谢你的帮助

它变为无限的原因:
scanf
拒绝
“%d”
的一个字母,并且没有读取任何内容。请注意,未使用输入缓冲区中的字母,因此下次调用
scanf
时再次失败

要了解更多信息,请检查
scanf
的返回值:
0
EOF
的未读返回值,以及
1
的已读返回值

因此,解决方案是检查
scanf
的返回值并中断循环

编辑: 增加了一个例子:

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);
do{
printf(“1.开始游戏。\n”);
printf(“2.招募部队。\n”);
printf(“3.退出。\n”);
int item_got=scanf(“%d”,选择(&choice);
如果(项目得到!=1)
{
choice=-1;//标记它。
打破
}
}而(选择<1 | |选择>3);

它变为无限的原因:scanf拒绝
%d“
的一个字母,并且什么都不读。请注意,未使用输入缓冲区中的字母,因此下次调用
scanf
时再次失败

要了解更多信息,请检查
scanf
的返回值:
0
EOF
的未读返回值,以及
1
的已读返回值

因此,解决方案是检查
scanf
的返回值并中断循环

编辑: 增加了一个例子:

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);
do{
printf(“1.开始游戏。\n”);
printf(“2.招募部队。\n”);
printf(“3.退出。\n”);
int item_got=scanf(“%d”,选择(&choice);
如果(项目得到!=1)
{
choice=-1;//标记它。
打破
}
}而(选择<1 | |选择>3);
如果无法读取格式化输入,As scanf()函数将返回0。因此,如果您希望在用户输入此类输入时退出,则可以编写:

if(!scanf("%d", &choice))break;
如果读取格式化输入失败,As scanf()函数将返回0。因此,如果您希望在用户输入此类输入时退出,则可以编写:

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

如前所述,如果出现故障,scanf可以返回非零的数字,请阅读手册。@AlexNorth Keys谢谢!我发现BluePixy的答案很好,但你的答案似乎是另一种方式。我甚至不知道如何得到scanf返回的结果,如果我这样做,我可能会像你说的那样将它集成到while条件中。@starrify是的,这非常接近,但它打破了循环。我希望它能继续下去…@物理很好,那么蓝精灵的方法就行了。另外,由于选项很少,您可以读取字符而不是整数。如前所述,如果失败,scanf可以返回除零以外的数字,请阅读手册页。@AlexNorth Keys谢谢!我发现BluePixy的答案很好,但你的答案似乎是另一种方式。我甚至不知道如何得到scanf返回的结果,如果我这样做,我可能会像你说的那样将它集成到while条件中。@starrify是的,这非常接近,但它打破了循环。我希望它能继续下去…@物理很好,那么蓝精灵的方法就行了。此外,由于选项很少,您可以读取字符而不是整数。这非常好,感谢您的解决方案。我假设它是某种正则表达式或指针之类的东西。如果您也能解释一下,我将不胜感激:)@thephysisguy它不是
scanf
中的正则表达式,但您可以进行简单的模式匹配<代码>%*[^\n]跳过除换行符以外的字符
%*c
跳过字符(保留换行符)。这意味着如果有额外字符的输入,我将跳过它。这非常好,谢谢你的解决方案。我假设它是某种正则表达式或指针之类的东西。如果您也能解释一下,我将不胜感激:)@thephysisguy它不是
scanf
中的正则表达式,但您可以进行简单的模式匹配<代码>%*[^\n]跳过除换行符以外的字符
%*c
跳过字符(保留换行符)。这意味着,如果输入了额外的字符,我将跳过它。