2014-11-04 37 views
0

所以我想讓用戶做出選擇,但我有問題。以下行更智能的方式來實現這個switch語句

cout << "\nWhat would you like to do? " << endl 
    << "(1) Display the entire List" << endl 
    << "(2) to exit" << endl; 

getline(cin,answer); 
answerint=stoi(answer); 
switch (answerint) { 
    case 1: 
     showLIST(myLIst); 
     break; 
    case 2: 
     return; 
    default: 
     cout << "\nPlease choose from the list"; 
    } 

所以這工作正常,如果用戶選擇一個整數,但它會barf如果收到一個字符。我怎樣才能使這個不易破裂?

+0

它是如何barf? – mainstreetmark 2014-11-04 01:41:40

+0

也許避免將任意輸入轉換爲int?或者捕捉拋出的異常並優雅地處理它? – 2014-11-04 01:41:47

+0

您需要檢查這些值,並確保它們在使用它們之前是有效的。 – Hosch250 2014-11-04 01:42:48

回答

1

看來你想是這樣的:

if (std::cin >> answerint) { 
    switch (answerint) { 
     // ... 
    } 
} 

直接從數據流轉換整數放流進入故障狀態的情況下,東西比輸入了int不同。您可能需要添加一個操縱器來確保行尾沒有非空格字符。

0
std::string answer; 
int answerint; 
while (std::getline(std::cin, answer)) 
{ 
    std::istringstream iss(answer); 
    char c; // seek non-whitespace after the number? 
    if (!(iss >> answerint) || (iss >> c)) 
     answerint = 0; 
    switch (answerint) 
    { 
     ...as you had... 
    } 
} 

上面的代碼使用getline以確保文本的一個完整的行被解析成answer,之後將其創建與單個線鮮明std::istringstream。這樣,我們可以使用>>知道它不會跳過換行消耗或等待進一步輸入。

if (!(iss >> answerint) || (iss >> c))檢查是否沒有數字要解析到answerint,或者在解析了一個數字後,在該行上出現一個額外的非空白字符。例如,鍵入的行可能已經2r - 我們會考慮,對於選擇錯誤,並重新提示,分配0answerint,以確保我們在switch達到default標籤,從而打印cout << "\nPlease choose from the list";這似乎爲適合2r作爲99或其他...

使用getline和單獨istringstream這樣,您可以可靠地嘗試解析來自已知狀態的下一行輸入。

相關問題