2017-07-28 46 views
0

我的問題是,我試圖做一個菜單作爲我的程序的一部分。有輸入的條件語句,我的else語句應該說輸入無效,並等待輸入(以便讓用戶知道他們輸入了一些無效的內容)。爲什麼當我輸入一個char時,這個特定的cin.get()語句在C++中不起作用?

這是相關的片段,以及我的嘗試:

void main_menu() { 
    int opt; 
    system("CLS"); 
    std::cout << "Main Menu" << std::endl; 
    std::cout << "\n\nWhat would you like to do?" << std::endl; 
    std::cout << "1) Fight" << std::endl; 
    std::cout << "2) Store" << std::endl; 
    std::cout << "3) Exit" << std::endl; 
    std::cin >> opt; 
    std::cin.ignore(); 

    if (opt == 1) { 
     return main_menu(); 
    } 
    else if (opt == 2) { 
     return main_menu(); 
    } 
    else if (opt == 3) { 
     return; 
    } 
    else { 
     system("CLS"); 
     std::cout << "Invalid!" << std::endl; 
     std::cin.get(); //error, but not seen in list or console 
    } 
} 
int main() { 
    main_menu(); 
    return 0; 
} 

我似乎什麼已經搞砸了的上是else。當我運行它時,代碼似乎通過了我設置的std::cin.get()

我想要的輸出:

Input = 1 // valid input 
go to statement 1 (empty for time being.) 

Input = 6 // invalid, but is handled with the else: 
cout << "Invalid!" << .... 
//pause 

Input = 'a' //invalid, should be like above: 
cout << "Invalid!" << .... 
//pause // in reality, it passes 

我已經嘗試了一些方法,看着比SO其他網站的一些職位(見張貼Why is the Console Closing after I've included cin.get()?)(我曾嘗試cin.ignore()cin >> var方法已經不靈) ,但沒有工作。

它確實有關換行符等的說法,但我不明白。有人可以解釋尾隨的換行符是如何工作的,爲什麼我的代碼段不工作?

編輯:cin.get()的其他陳述已在我的實際代碼中工作。

編輯:我試着輸入一個數字以外的無效選項,但它沒有工作(比如字符)。 Nums雖然工作。所以現在的問題是如何處理除int,float,double等數據類型。

+0

'opt'是'int'類型,是不是? –

+0

是的,我已經從鏈接文章中讀到它可能是來自int輸入的尾隨換行符。 –

+1

做'std :: cout <<(int)std :: cin.get();',那麼你可以看到什麼字符被讀取。如果您在 –

回答

1

默認情況下,ingore只會忽略1個字符。在windows \ r和\ n中輸入後至少有2個字符。

你會好做:

cin.ignore(999,'\n') 
+0

我試了一下,但沒有奏效,謝謝你的建議。 –

+1

'\ r \ n'是如何將新行存儲在文件中的;當程序看起來操作系統會將其轉換爲'\ n' –

+1

不,在文本流中Windows行結束標記將被視爲單個'\ n'字符。 – AnT

相關問題