-2

我有一个简单的 c++ 程序,它有一个菜单,允许用户选择一个带有数字的选项。还有一个代码块可以确保用户的输入是有效的,但是,当我输入一个字母(“s”)时。我没有显示错误消息然后允许用户输入有效响应,而是收到相同错误消息的无限循环。代码:

#include <iostream>
#include <algorithm>
using namespace std;

int main(){

const string PROMPT = ">> ";
int options[3] = {1, 2, 3};
int option;

// Display menu
cout << "MENU" << endl
<< "1\tAdult Tickets" << endl
<<"2\tStudent Tickets" << endl
<< "3\t2 Adults, 2 Children Tickets" << endl << endl;

// Getting option from the user and validating it
do {
// Prompt for input and get option from user
cin >> option;

// Displaying appropriate error messages
if (!isdigit(option)){
  // Invalid data type
  cout << "This is not a valid number!" << endl;
  // Not on the options menu
} else if (!(find(options, options + sizeof(options)/ sizeof(options[0]), option))){
  cout << "This option is not on the menu!" << endl;
}

} while (!isdigit(option) || !(find(options, options + sizeof(options)/ sizeof(options[0]), option)));
return 0;
}

这是我输入“s”时的输出示例

这不是一个有效的号码 这不是一个有效的号码!这不是一个有效的号码!这不是一个有效的号码!这不是一个有效的号码!这不是一个有效的号码!这不是一个有效的数字!...

任何帮助将不胜感激,并提前感谢您。

4

2 回答 2

0

解决此问题的一种可能方法是创建变量跟踪有效性。就像一个 int ,其中 0 表示它是有效的,而 1 或更多可能是无效的,然后让你的循环条件检查变量。

于 2021-06-06T23:39:29.833 回答
0

对于初学者,变量option应具有类型char

char option;

在这种情况下,您可以将该功能isdigit应用于输入的字符。

此外,您在 if 语句中错误地使用了 find 算法。

循环可以如下所示。

#include <iterator>

//...

char option;
bool valid_input;

do {
    valid_input = false;

    // Prompt for input and get option from user
    cin >> option;

    // Displaying appropriate error messages
    if ( not isdigit( ( unsigned char )option)){
        // Invalid data type
        cout << "This is not a valid number!" << endl;
        // Not on the options menu
    } else if ( find( std::begin( options ), std::end( options ), option - '0') == std::end( options ){
      cout << "This option is not on the menu!" << endl;
    }
    else
    {
        valid_input = true;
    }
} while ( not valid_input );
于 2021-06-06T19:50:46.933 回答