有人可以启发如何使这项工作?所以现在我有一个内置开关的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');
答案 0 :(得分:4)
使用%d
,如果输入非整数,scanf
会忽略它,而不会将其从输入缓冲区中删除。每次循环时,非{ -character仍然存在,因此scanf
忽略它,choice
永远不会改变,循环永远不会退出。
修改您可以通过检查scanf
的返回值来判断是否发生了这种情况。如果返回值为1
,则scanf与格式字符串中的单个(%d
)项1
匹配。如果返回值为0
,则scanf
无法与%d
匹配,例如,因为存在字符数据。我认为这是你的代码中发生的事情。
如何在this answer中详细讨论scanf
之前清除输入。但是,正如@WeatherVane中comment所述,最好使用fgets
来获取整行,然后使用sscanf
提取整数(如果有的话)从你得到的字符串。例如,参见this answer。
来源:
当找到不匹配的字符时,读取字符会停止
因此,非数字会保留在输入流中,例如,未来的scanf
会尝试匹配。
答案 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