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;

}

私はアサーション値のデバッグにあまり慣れていません。メニューをスタンドアロンで動かしてみた

4

2 に答える 2

3

ここでの問題は、入力が入力されていないため、Enter キーを押すと空の文字列がgetline設定されることです。input

これは、長さが 0 であることを意味しますが、呼び出すinput[0]ときは最初の文字を要求しています。持っていないため、アサーション エラーがスローされます。

これを修正するには、getlinecheck を呼び出して が空かどうかを確認した後input、空である場合は、 を使用continueしてループを最初からやり直します。

于 2012-11-10T08:13:49.657 に答える
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')));

一般に、否定が少ないほど、複雑なブール論理が理解しやすくなります。

于 2012-11-10T08:18:25.870 に答える