断言错误,字符串下标超出范围

时间:2012-11-10 08:11:05

标签: c++ assertion

我几乎完成了这个菜单并按照我想要的方式工作。但是,当我按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;

}

我对调试断言值不太熟悉。我尝试单独运行菜单

2 个答案:

答案 0 :(得分:3)

这里的问题是,当您输入getline时将input设置为空字符串,因为没有输入任何输入。

这意味着它的长度为0,但是当你打电话给input[0]时,你要求的是第一个字符。由于它没有,它会抛出一个断言错误。

要解决此问题,请在调用getline后检查input是否为空,如果是,请使用continue重新开始循环。

答案 1 :(得分: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')));

通常,较少的否定就是更容易理解的复杂布尔逻辑。