C - 执行/ while循环和切换(int)。键入char值会导致inf。环

时间:2016-12-27 17:17:54

标签: c

有人可以启发如何使这项工作?所以现在我有一个内置开关的do / while循环。该开关由int选项处理,scanf为“%d”。但是,如果我写一个不同于a,b,c等数字的字符符号,它会进入无限循环。将int更改为char,将%d更改为%c,但如果输入错误,菜单会重复x2,它会变得混乱。抱歉英文不好:) 使用int:

int main() {
 int choice;
    do{
        menu();
        scanf("%d", &choice);
    switch(choice) {
        case 1:
            // 1-vo poduslovie
            ReadSave();
            break;
        case 2:
            // 2-ro poduslovie
            ShowResult();
            break;
        case 3:
            // 3-to poduslovie
            SavetoScreen();
            break;
        case 4:
            // 4-to poduslovie
            PrinttoScreen();
            break;
        case 5: // exit
            return 0;
        default:
            printf("Wrong choice.\n");
    }
}while(choice!=5);

使用char:

int main() {
 char choice;
    do{
        menu();
        scanf("%c", &choice);
    switch(choice) {
        case '1':
            // 1-vo poduslovie
            ReadSave();
            break;
        case '2':
            // 2-ro poduslovie
            ShowResult();
            break;
        case '3':
            // 3-to poduslovie
            SavetoScreen();
            break;
        case '4':
            // 4-to poduslovie
            PrinttoScreen();
            break;
        case '5': // exit
            return 0;
        default:
            printf("Wrong choice.\n");
    }
}while(choice!='5');

2 个答案:

答案 0 :(得分:4)

使用%d,如果输入非整数,scanf会忽略它,而不会将其从输入缓冲区中删除。每次循环时,非{ -character仍然存在,因此scanf忽略它,choice永远不会改变,循环永远不会退出。

修改您可以通过检查scanf的返回值来判断是否发生了这种情况。如果返回值为1,则scanf与格式字符串中的单个(%d)项1匹配。如果返回值为0,则scanf无法与%d匹配,例如,因为存在字符数据。我认为这是你的代码中发生的事情。

如何在this answer中详细讨论scanf之前清除输入。但是,正如@WeatherVanecomment所述,最好使用fgets来获取整行,然后使用sscanf提取整数(如果有的话)从你得到的字符串。例如,参见this answer

来源:

  • scanf manpage说:

      

    当找到不匹配的字符时,读取字符会停止

    因此,非数字会保留在输入流中,例如,未来的scanf会尝试匹配。

  • fgets manpage

答案 1 :(得分:-2)

我结束了这个:

int choice;
 char string[20];
    do{
        menu();
        fgets(string, sizeof(string), stdin);
        sscanf(string, "%d", &choice);
     switch(choice) { /*menu......*/}

完整代码:(还没有在那里编辑过它)。 https://drive.google.com/file/d/0B5H_NO3oeuLZNjJ2bjdzcWJsNzQ/view