Ошибка подтверждения, строковый индекс вне диапазона

Я почти сделал это меню и работаю так, как хочу. Тем не менее, я получаю ошибку подтверждения, когда я нажимаю 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

Решение

Проблема в том, что когда вы нажимаете Enter getline наборы input в пустую строку, так как ввод не был введен.

Это означает, что он имеет длину 0, но когда вы звоните input[0] вы просите первого персонажа в нем. Так как у него его нет, выдается ошибка подтверждения.

Чтобы это исправить после звонка getline проверьте, если input пусто, если оно есть, используйте continue чтобы начать цикл снова.

3

Другие решения

Вам нужно изменить условие цикла.

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

По вопросам рекламы [email protected]