Я почти сделал это меню и работаю так, как хочу. Тем не менее, я получаю ошибку подтверждения, когда я нажимаю 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;
}
Я не слишком опытен с отладкой значений утверждений. Я пытался запустить меню автономно
Проблема в том, что когда вы нажимаете Enter getline
наборы input
в пустую строку, так как ввод не был введен.
Это означает, что он имеет длину 0, но когда вы звоните input[0]
вы просите первого персонажа в нем. Так как у него его нет, выдается ошибка подтверждения.
Чтобы это исправить после звонка getline
проверьте, если input
пусто, если оно есть, используйте continue
чтобы начать цикл снова.
Вам нужно изменить условие цикла.
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')));
Как правило, чем меньше отрицаний, тем легче понять сложную логическую логику.