2012-11-10 56 views
1

我幾乎已經完成了該菜單並按照我希望的方式工作。然而,當我按Enter鍵而沒有輸入任何內容時,我得到斷言錯誤。下面是代碼斷言錯誤,字符串下標超出範圍

#include <iostream> 
#include <cstdlib> 
#include <string> 
#include <sstream> 
#include <iomanip> 


using namespace std; 

bool menu() 
{ 
string input = ""; 
bool exitVar; 

do 
{ 
system("cls"); 

cout << "    _  _ _ _  _ _ _ _ " << endl 
     << "    |_|_ _|_| |_| |_|_ |_| |_|_|_| " << endl 
     << "    |_|_|_|_|_| |_| |_|_|_ |_| |_|_ " << endl 
     << "    |_| |_| |_| |_| |_| |_|_|_| |_|_| " << endl 
     << "    |_|  |_| |_| |_| |_|_| |_|_ _ " << endl 
     << "    |_|  |_| |_| |_|  |_| |_|_|_| " << endl 
     << "    _ _ _  _ _ _ _ _ _ _ _ _  _ _ _ _ _  " << endl 
     << "    _|_|_| |_|  |_| |_|_|_| |_|_|_| |_|_|_ |_|_|_| |_|_|_ " << endl 
     << "   |_|_ |_| _ |_| |_|_ |_|_ |_|_|_| |_|_ |_|_|_| " << endl 
     << "    |_|_ |_|_|_|_|_| |_|_| |_|_| |_|_| |_|_| |_|_|_ " << endl 
     << "    _ _|_| |_|_| |_|_| |_|_ _ |_|_ _ |_|  |_|_ _ |_| |_|_ " << endl 
     << "   |_|_| |_|  |_| |_|_|_| |_|_|_| |_|  |_|_|_| |_| |_| " << endl; 

cout << "\n   Welcome to Psuedo Mine Sweeper!!\n\n\n\n"; 

cout << "     <S>TART" 
    << "\n\n     <E>XIT\n\n"; 



    cout << "\t\t\tPlease enter a valid menu option: "; 
    getline(cin,input); 

    input[0] = toupper(input[0]); 

}while(input[0] != 'S' && input[0] != 'E' || input.length() != 1 || cin.peek() != '\n'); 

if (input[0] == 'S') 
    exitVar = true; 
else 
    exitVar = false; 

return exitVar; 

}

我不是太調試斷言值經歷。我嘗試運行菜單單機版

+1

嘗試在getline後打印輸入,您可能會看到問題! – Mario

回答

3

這裏的問題是,當您按輸入getlineinput設置爲空字符串,因爲沒有輸入輸入。

這意味着它的長度爲0,但是當您撥打input[0]時,您正在詢問其中的第一個字符。由於它沒有一個,它會引發斷言錯誤。

要解決此問題,請在致電getline後檢查input是否爲空,如果是,請使用continue重新開始循環。

+0

Ahhhhh,這是有道理的。如果我將「字符串輸入」的定義更改爲某個值而不是將其留空,那麼是否可以解決問題。現在就試試看,只是猜測。非常感謝! –

+0

@DustinBurns沒問題! – jozefg

+0

不,沒有工作....嗯。我猜這是行不通的,因爲當我嘗試getline時,如果輸入被推入,它將字符串重新定義爲空。我怎樣才能解決這個問題? –

1

你需要改變你的循環條件。

while (input.length() != 1 || (toupper(input[0]) != 'S' && toupper(input[0]) != 'E'));

||測試從左到右,所以你必須檢查的長度是正確的值您檢查的第一個字符之前。這也將有助於做toupper作爲環路條件的一部分,因爲這種方式首先檢查長度。我也刪除了電話cin.peek(),不知道我明白這是關於什麼。

你可以使用一些布爾邏輯來重寫整個事物,使其更清晰。

while (!(input.length() == 1 && (toupper(input[0]) == 'S' || toupper(input[0]) == 'E')));

通常較少否定有越容易複雜的布爾邏輯是瞭解。

+1

他也在循環條件之前調用input [0] – jozefg

+0

所以他這樣做。我會修改我的答案。 – john

+0

修正了它!你做了什麼,並刪除了我在循環之前調用input [0]的部分。很高興知道,雖然循環執行從左到右,跳過我的腦海。非常感謝你們! –