[英]C - do/while loop and switch(int). Typing a char value causes inf. loop
有人可以啟發如何使這項工作? 所以現在我有一個內置開關的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');
對於%d
,如果輸入非整數,則scanf
忽略它並且不將其從輸入緩沖區中刪除。 每次循環時,非字符仍然存在,因此scanf
忽略它, choice
永遠不會改變,循環永遠不會退出。
編輯您可以通過檢查scanf
的返回值來判斷是否發生了這種情況。 如果返回值為1
,則scanf匹配%d
,即格式字符串中的單個( 1
)項。 如果返回值為0
,則scanf
與%d
不匹配,例如,因為存在字符數據。 我認為這是你的代碼中發生的事情。
在本答案中詳細討論了如何在scanf
之前清除輸入。 但是,正如@WeatherVane在評論中所說,你可能最好使用fgets
來獲得整行,然后使用sscanf
從你得到的字符串中提取整數(如果有的話)。 參見,例如, 這個答案 。
資料來源:
我結束了這個:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.