我几乎完成了这个菜单并按照我想要的方式工作。但是,当我按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;
}
我对调试断言值不太熟悉。我尝试单独运行菜单
答案 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')));
通常,较少的否定就是更容易理解的复杂布尔逻辑。