簡體   English   中英

C - 執行/ while循環和切換(int)。 鍵入char值會導致inf。 環

[英]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從你得到的字符串中提取整數(如果有的話)。 參見,例如, 這個答案

資料來源:

  • scanf說:

    當找到不匹配的字符時,讀取字符會停止

    因此,非數字留在輸入流中,例如,用於未來的scanf以嘗試匹配。

  • fgets

我結束了這個:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM