2017-07-25 64 views
0

我試圖創建一個程序,要求鍵入一些東西,並檢查它是否是一個整數。如果它是一個整數,則打印「整數是...」。否則,打印「再試一次」並等待另一個輸入。但是,如果您鍵入字符,該程序會打印無限數量的「再次嘗試」。這裏的源代碼:檢查輸入程序卡在一個無限循環

#include <stdio.h> 
#include <stdbool.h> 

int main() 
{ 
    int inp; 
    bool t = 1; 
    printf("type an integer\n"); 
    while (t) { 
    if (scanf("%i", &inp) == 1) { 
     printf("The integer is %i", inp); 
     t = 0; 
    } else { 
     printf("try again"); 
     scanf("%i", &inp); 
    } 
    } 
} 
+1

沒有讀取非數字輸入的代碼。加一些。否則,非數字輸入保留在'stdin'中。 – chux

+0

如果你使用某種合理的空白約定,你更可能得到幫助。你有什麼是毛病。我編輯過它。 – Gene

+0

您是否曾想過'scanf'會返回成功匹配並分配的輸入項的數量? – paul

回答

2

OP的代碼無法使用有問題的非數字輸入。它仍然在stdin中,用於下一個輸入功能。因爲不幸的是只有另一個scanf("%i", &inp),它以同樣的方式失敗 - 無限循環。

試圖讀取int後,讀取行的其餘部分。

#include <stdio.h> 
#include <stdbool.h> 

int main() { 
    int inp; 
    int scan_count; 
    printf("Type an integer\n"); 
    do { 
    scan_count = scanf("%i", &inp); // 1, 0, or EOF 

    // consume rest of line 
    int ch; 
    while ((ch == fgetchar()) != '\n' && ch != EOF) { 
     ; 
    } 

    } while (scan_count == 0); 
    if (scan_count == 1) { 
    printf("The integer is %i\n", inp); 
    } else { 
    puts("End of file or error"); 
    } 
} 

更好的方法是用fgets()讀取用戶輸入行。 Example

0

檢查這裏while(t)其無限循環,因爲你必須設定一個條件t類似,而(T == 1)或者同時(T> 1)或(T < 1 )類似的東西。 (t)表示t可以是任何東西,它會繼續運行。

+0

哦,我沒有注意到t是布爾 –

0

沒有什麼在打破while循環。

考慮擺脫布爾,並簡單地使用while(1)循環與休息。你也應該使用「%d」來表示scanf/printf中的一個整數。並且在else中不需要scanf調用,因爲您的程序將循環返回並再次調用scanf。

#include <stdio.h> 
int main() { 
    int inp = 0; 
    printf("type an integer\n"); 
    while (1) { 
    if (scanf("%d", &inp) == 1) { 
     printf("The integer is %d", inp); 
     break; 
    } 
    else { 
     printf("try again"); 
    } 
    } 
    return 0; 
} 

我希望這有助於。

+0

謝謝。我執行了你的代碼,但同樣的問題依然存在。它在你的電腦上工作嗎? – pxc3110

+0

你輸入了1嗎?在你的if塊中,你將inp與1進行比較,所以我假設你想要檢測一個用戶是否在控制檯中輸入1。 –

+0

如果我沒有弄錯輸入是一個整數,scanf將返回1。 – pxc3110

1

當你進入一個char,在scanf("%d", &inp)變量inp會得到null,因爲不格式字符串匹配輸入。而且你輸入的字符會保留在緩衝區中,所以這就是你的scanf不會停止的原因。

解決此問題的最簡單方法是將第二個scanf("%i", &inp);修改爲scanf("%c", &c);(不要忘記在主函數中聲明char c)。