2013-05-20 85 views
1
int option; 
int invalidOption2 = 0; 

while(invalidOption2 == 0){ 
     try{ 
     cin>>option; 
     if(!cin){ 
      error("invalid input"); 
     } 
     if(option<1 || option>2){ 
      error("invalid input"); 
     } 
     if(option==1) { 
      invalidOption2 = 1; 
      cout<<"option 1 was selected"<<endl; 
     } 
     else if(option==2) { 
      invalidOption2 = 1; 
         cout<<"option 2 was selected"<<endl; 
     }  
     } 
     catch(runtime_error& e) { 
       cerr <<"Please enter a valid option" << endl; 
     } 
} 

當使用上面的代碼時,對於第一個輸入的值,它將移動到下一行並等待另一個輸入,而不是顯示選項消息或錯誤信息。但是,當我輸入第二個值時,它正常工作。while循環 - 第一次輸入後什麼也沒有發生

例如,如果我進入

一個(沒有發生在這裏,所以我需要進入另一個值)

「您已選擇選項1」

將顯示並且沒有原始無效輸入的錯誤消息。

我想知道如何得到下面的結果。

一個

「請選擇一個有效的選擇」

「您已選擇選項1」

任何幫助,將不勝感激

+0

什麼類型是「選項」? – Bathsheba

+0

對不起,我將它編輯成問題,選項是類型int – user2383238

回答

1

除非 異常被拋出了你不會得到的"Please enter a valid option"。你不顯示error,但如果它不 拋出異常,你永遠不會到達catch塊。

此外,cin >> option幾乎肯定離開在 緩衝區的新線,這可能會導致後面的問題,並whien你輸入一個 α,如果option是類型intcin將進入一個錯誤 狀態,這就需要將清除(並刪除了錯誤的輸入 )。因此,在錯誤情況下(!cin),您需要致電 cin.clear(),並且在所有情況下,您可能都需要致電 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n' )

的備選解決方案,這避免了這些問題的大部分,是 讀取完整線(使用std::getline(std::cin, line)) 然後使用std::istringstream解析線。這將 離開std::cin在一個良好的狀態,並準備輸入下一個 線。

+0

對不起,我不明白你的意思是不會顯示消息,除非拋出異常。如果我輸入了一個,然後輸入了另一個,它會捕獲第二個錯誤,但不是第一個錯誤。 – user2383238

+0

沒有看到'error',不可能說,但是你在'catch'塊中輸出''請輸入一個有效的選項'',這意味着它將不會被執行,除非有異常。 –

+0

所以我需要拋出一個異常,如果輸入無效?我從來沒有真的用過,所以我不知道該怎麼辦?我可能會更好地使用你的第二個想法。 – user2383238

0

選項可能是整數類型,所以cin不能讀入'a',所以它被忽略。

這是你的情況嗎?

你可以修改它是這樣的:

char option; 
while(invalidOption2 == 0){ 
    try{ 
     cin>>option; 
     if(!cin){ 
      error("invalid input"); 
     } 
     if(option<'1' || option>'2'){ 
      error("invalid input"); 
     } 
     if(option=='1') { 
      invalidOption2 = 1; 
      cout<<"option 1 was selected"<<endl; 
     } 
     else if(option=='2') { 
      invalidOption2 = 1; 
      cout<<"option 2 was selected"<<endl; 
     }  
    } 
    catch(runtime_error& e) { 
     cerr <<"Please enter a valid option" << endl; 
    } 
} 

這應該工作,你如何指望它。

然而,建設這樣的:

char option; 
while (cin >> option) { 
    if ((option == '1') || (option == '2')) { 
     break; 
    } 
    else { 
     cout << "Please enter 1 or 2." << endl; 
    } 
} 
cout << "option " << option " << " was selected" << endl; 

可能是更好的^ _^

+1

爲什麼不'while(std :: cin >>選項&&選項!='1'&& optionn!='2')std :: cout << 「請輸入1或2:」<< std :: endl;'。爲什麼要將代碼與循環中的多個退出混淆起來,並在整個地方測試最終條件。 –

+0

感謝您的幫助,但我嘗試將選項聲明爲一個字符而不是int,而且我仍然遇到同樣的問題。我還沒有測試過最新的代碼,但是如果我輸入一個字符串作爲選項,會發生什麼情況?它能處理這個問題嗎? – user2383238

+0

我不明白爲什麼不..如果你改變類型爲字符串,並在if中比較againts字符串,它應該工作。多行字符串可能是問題,但情況並非如此,對吧? – Paladin

0

我覺得這看起來更好的代碼(至少對眼睛):

int option; 
int invalidOption2 = 0; 

while(invalidOption2 == 0) 
{ 
     try 
     { 
     cin>>option; 
     switch(option) 
     {  

     case 1 : 
      invalidOption2 = 1; 
      cout<<"option 1 was selected"<<endl; 
      break;  
     case 2 : 
      invalidOption2 = 1; 
      cout<<"option 2 was selected"<<endl; 
      break; 
     default : 
      error("invalid input");  

     } 
     catch(runtime_error& e) 
     { 
       cerr <<"Please enter a valid option" << endl; 
     } 
} 

如果你仍然認爲你有問題intcharcin然後更好地利用:

option = getchar(); 
0

我認爲兩次調用cin可能是問題,但我不確定。像這樣的東西應該也可以:

char option[80]; // 80 is the standard terminal line length 
bool loop = 1; 
while(loop) 
{ 
    cin >> option; 
    if (option[1]=='\n') // testing if string is length 1 
    { 
     cout << "Please select a valid input\n"; 
     continue; // if not, display error and try again 
    }; 
    switch(option[0]) 
    { 
     case '1': loop=0; break; // add whatever before break 
     case '2': loop=0; break; 
     default: cout << "please select a valid input\n"; break; 
    }; 
}; 
cout << "Option "<< option << "was selected\n"; 

我沒有編譯這個,但它應該沒問題。

+0

謝謝,我會在一分鐘內看一看,看看它是否有效 – user2383238

相關問題