2012-11-10 3 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

여기서 입력 문제가 발생하면 getline을 입력하면 input이 입력되지 않았으므로 빈 문자열로 설정됩니다.

이것은 길이가 0을 가지고 의미하지만, 당신이 호출 할 때 input[0] 당신은 그것의 첫 번째 문자에 대한 요구하고있다. 하나도 없으므로 어설 션 오류가 발생합니다.

이 문제를 해결하려면 getline을 호출 한 후 input이 비어 있는지 확인하십시오. 그렇다면 continue을 사용하여 루프를 다시 시작하십시오.

+0

아, 맞아. "문자열 입력"의 정의를 비워 두지 않고 값으로 변경하면 문제가 해결됩니다. 추측 해보고 추측 해봐. 정말 고마워! –

+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

그는 또한 [0] – jozefg

+0

그래서 그가하는 루프 조건 전에 입력을 호출합니다. 나는 내 대답을 고칠 것이다. – john

+0

해결되었습니다! 당신이 말한 것을 수행하고 루프 앞에서 입력 [0]을 호출 한 부분을 제거했습니다. 루프가 왼쪽에서 오른쪽으로 실행되는 동안 내 마음을 스킵한다는 점을 알아두면 좋습니다. 고마워요! –