2015-12-22 168 views
3

在這個循環中,用戶應該輸入一個int並且程序檢查它是否是奇數它會轉到下一個部分,但是我不明白爲什麼如果用戶輸入的字符不是int ,該程序正陷入無限循環!do-while循環與if C++

int num; 
do { 
    cout << "PLEASE enter the num: "; 
    cin >> num; 
    if (num % 2 == 0) 
     cout << "Number should be odd!" << endl; 
    else 
     break; 
} while (true); 
//... 

原因反正char/int != 0,如果它是==0也應該在明年cin停止,但它不會停止! 我也試過ws(cin),但它沒有幫助我。 請告訴我如何解決這個問題,以及爲什麼會發生這種情況。

+2

見[此](http://stackoverflow.com/questions/13378989/why-does-stringstream-change-value-of-target-on-failure)。 – LogicStuff

回答

4

由於您的程序不檢查cin >> num;的結果。由於cin >> num;(其中num是一個整數)將讀取所有可用的數字,並且如果輸入根本不是數字[並且不是空格字符,它們被跳過cin >>],則它會不斷嘗試讀取輸入。

這不是從你的問題清楚自己想要做的,當用戶輸入「askjhrgAERY8IWE」你的計劃到底是什麼 - 有兩種解決方案,浮現在腦海中:

備選1移除錯誤的之後再問輸入。這對於這個應用程序來說可能是正確的,因爲它是交互式的,但是對於從文件中讀取其輸入的自動程序來說,這是一個糟糕的主意。

if(!(cin >> num)) 
{ 
    cout << "That deoesn't seem to be a number..." << endl; 
    cin.clear(); 
    cin.ignore(10000, '\n'); 
} 

Alt 2.退出並顯示錯誤消息。當典型輸入是數據文件時,這顯然是正確的。

if(!(cin >> num)) 
{ 
     cout << "That deoesn't seem to be a number..." << endl; 
     exit(1); 
} 

您還應該添加代碼來處理這個代碼文件的末尾 - 文件輸入,應該是可以接受的[除非文件中有具體的數據來結束標誌。對於交互式輸入(用戶直接輸入程序),文件結尾可能被認爲是錯誤 - 這取決於接下來會發生什麼。

+0

我在你的答案結尾處無意中想到了一些單詞。 – BoBTFish

+0

@BoBTFish:謝謝,平常的「過早發佈」。 –

+0

我想告訴你什麼,但'CIN >> num'不是TRUE;當我進入'abcd'太 –

0

在你的程序中,標準輸入流需要一個整數。當你給它一個字符時,cin不能將它放入整型變量中,即失敗(設置錯誤標誌)並將輸入的字符留在緩衝區中(用於下一個cin賦值)。 CIN反覆考慮的字符作爲輸入,並不停地進行故障和整型變量賦值爲0。

爲了防止這種情況,你可以修改你的程序作爲

int num; 
    do{ 
     cout << "PLEASE enter the num: "; 
     while(!(cin>>num)){ 
     cin.clear(); 
     cin.ignore(INT_MAX,'\n'); 
     cout<<"Invalid. Enter a number"; 
    } 
     if (num % 2 == 0) 
      cout << "Number should be odd!" << endl; 
     else 
      break; 
    } 
while(true); 

包括limits.h中使用INT_MAX或者你可以使用10000的較大值。

cin.clear清除錯誤標誌並使其準備好輸入。 cin.ignore(INT_MAX,'\n')會忽略所有內容(最多可達INT_MAX個字符),直到下一個新行。這可以確保如果用戶輸入一個長行而不是一個數字,程序就可以正常工作。

+0

這不會幫助,如果用戶編寫'1abc',程序會接受它,並且會通過循環,但只有當輸入爲NUMBER且ODD通過循環時才需要。 –

0

我發現了一個方法來解決我的問題,我改變輸入類型string,並提出了功能的打擊:

int isNum(string input) 
{ 
    int digit, value = 0; 
    for (int i = 0; i < input.length(); i++) 
    { 
     digit = input[i] - '0'; 
     if (digit >= 0 && digit <= 9) 
      value = value * 10 + digit; 
     else 
     { 
      value = 0; 
      break; 
     } 
    } 
    return value; 
} 

它將返回輸入作爲int如果所有字符是0到9之間,和否則將return 0;給我,所以我使用返回int爲我num