簡體   English   中英

驗證輸入進入無限循環

[英]Validating Input goes into infinite loop

我正在嘗試驗證輸入,如果輸入不是 1 到 3,它將提示無效輸入,並嘗試獲取新輸入,直到它有效為止。

當我嘗試輸入 1 到 3 中的任何數字時,這段代碼運行良好,但是一旦我輸入字母,代碼就會進入無限循環。

    int searchBy;

searchInput:
    printf("1 - Search by id\n");
    printf("2 - Search by name\n");
    printf("3 - Search by marks\n>> ");
    printf("Please choose the searching method\n>> ");
    scanf("%d", &searchBy);
    if(searchBy >= 1 && searchBy <= 3){
        printf("Success");
    }
    else{
        printf("\nInvalid input please try again...\n\n");
        goto searchInput;
    }

我嘗試使用 while 循環,但當我嘗試輸入字母時它仍然進入無限循環。 似乎程序沒有在scanf處凍結,而是繼續循環

while(searchBy >= 1 && searchBy <= 3 != 1){
        printf("\nInvalid input please try again...\n\n");
        printf("1 - Search by id\n");
        printf("2 - Search by name\n");
        printf("3 - Search by marks\n>> ");
        printf("Please choose the searching method\n>> ");
        scanf("%d", &searchBy);
    }

您將需要使用scanf不接受的字符.....一種解決方案是在“scanf”之后使用getchar()

scanf("%d", &searchBy);
getchar();//consume the character not accepted by scanf
if(searchBy >= 1 && searchBy <= 3){
    printf("Success");
}
else{
    printf("\nInvalid input please try again...\n\n");
    goto searchInput;
}

在任何需要特定輸入的情況下,您都希望不斷循環,直到用戶提供您需要的輸入。 (強制用戶輸入您需要的內容),處理任何無效輸入,然后重復,直到您獲得所需內容或用戶生成手動EOF取消輸入。

嘗試使用scanf讀取對於新的stdin程序員來說充滿了陷阱,因為在輸入錯誤的情況下會留在標准輸入中。 使用面向行的輸入 function 例如fgets()或 POSIX getline()聲明一個足夠大的緩沖區來處理所有用戶輸入(包括一只貓意外踩到鍵盤)會好得多,然后解析您需要的信息從緩沖區填滿。

在這種情況下,由於您只關心輸入的第一個字符,因此根本不需要轉換,只需在第一個字符上使用switch()並采取適當的操作。

你可以做類似的事情:

#define MAXC 1024   /* if you need a constant, #define one (or more) */
...

    char buf[MAXC]; /* buffer to hold entire line of input */

    while (1) { /* loop continually until user chooses quit (or generates EOF) */
        /* display menu */
        fputs ( "\n1 - Search by id\n"
                "2 - Search by name\n"
                "3 - Search by marks\n"
                "q - quit\n\n"
                "choose search method: ", stdout);
        /* read entire line -- validate */
        if (fgets (buf, MAXC, stdin) == NULL) {
            fputs ("(user canceled input)\n", stderr);
            break;
        }

        switch (*buf) { /* switch on 1st char in buf */
            case '1':       /* do search by id here */
                break;
            case '2':       /* do search by name */
                break;
            case '3':       /* do search by marks */
                break;
            case 'q':
                goto done;  /* goto only used to break nested statements */
                break;
            default:    /* always handle the default: case */
                fputs ("error: invalid choice.\n", stderr);
                break;
        }
    }
    done:;  /* goto label */

注意:您甚至可以使用您的goto ,只是不像您最初嘗試的那樣。另請注意,您只需要一次調用 output function 即可顯示您的菜單。預處理器將連接所有相鄰的雙引號字符串。)

仔細查看,嘗試一下,如果您還有其他問題,請告訴我。

用於否定條件

 int x;
 printf("1 - Search by id\n");
 printf("2 - Search by name\n");
 printf("3 - Search by marks\n>> ");
 printf("Please choose the searching method\n>> ");
 x=scanf("%d", &searchBy);
while( !(searchBy >= 1 && searchBy <= 3) || (x!=1) ){
    printf("\nInvalid input please try again...\n\n");
    printf("1 - Search by id\n");
    printf("2 - Search by name\n");
    printf("3 - Search by marks\n>> ");
    printf("Please choose the searching method\n>> ");
    x=scanf("%d", &searchBy);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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