2012-08-05 121 views
0

下面是C++中簡單菜單的代碼。出於某種原因,如果您給它垃圾輸入,它會正確反應(「請再次嘗試您的選擇」)。然而,它會再次通過循環再次發出錯誤消息,然後最終恢復正常運行。在C++中重複循環

編輯

輸入變量是char。如果垃圾輸入只有一個字符長度,那麼該循環就像它應該的那樣工作。如果在用戶被允許再次輸入任何內容之前有任何額外的字符會導致循環被執行超過一次。

char input = 0; 
    while (input != 4) 
{ 
    cout << "1. Circle"; 
    cout << "\n2. Rectangle"; 
    cout << "\n3. Triangle"; 
    cout << "\n4. Quit"; 
    cout << "\nChoose a shape: "; 
    cin >> input; 

    switch(input) 
    { 
    case '1': 
     circleFunctions(); 
     break; 
    case '2': 
     rectangleFunctions(); 
     break; 
    case '3':   
     triangleFunctions(); 
     break; 
    case '4': 
     exit(4); 
    default: 
     cout << "\nPlease try your selection again...\n"; 
     input = NULL; 
     cin.ignore(); 
     break; 
    } 

    cin.ignore(); 
    cout << "\n"; 
} 
+0

看到這個常見問題:爲什麼我的程序進入一個無限循環當有人進入非法字符?(HTTP://www.parashift。 com/C++ - faq/stream-input-failure.html) - 你使用'ignore'錯誤而不是調用'clear'。 – ildjarn 2012-08-05 00:14:56

+0

我會假設輸入是一個int。你問什麼? – 2012-08-05 00:15:20

+1

正如Xero所回答的那樣,std :: cin.clear()應該修復它,但是要注意你的輸入類型,它看起來像你將它比作while語句中的一個數字,但在case語句中它是一個char 。 – SMK 2012-08-05 00:23:55

回答

0

找到了答案。添加下列參數cin.ignore使工作:

cin.ignore(20, '\n'); 
1

您只需要在遇到默認情況下,當清除輸入緩衝器,

std::cin.clear(); 

之後忽略輸入流中的一切,

std::cin.ignore(INT_MAX); 

這將會使CIN緩衝區處於良好狀態,並且提取操作符(>>)應該正常工作。

+0

有趣..如果垃圾輸入只有一個字符長,程序運行良好。如果有任何其他字符使程序循環兩次。 – NealR 2012-08-05 00:27:34

+0

將你的cin.ignore()改爲cin.ignore(INT_MAX);我不在Linux上,所以無法測試,但您應該能夠解決這些問題。 – Akshet 2012-08-05 00:29:21

+0

由於某種原因導致程序崩潰。您將收到錯誤消息「請再次嘗試您的代碼」,然後一無所獲。 – NealR 2012-08-05 00:32:46