c++ - 使用 while 循环检查 switch case 中的输入错误

标签 c++ oop while-loop switch-statement

我有一个开关,其中一种情况要求用户提供多个输入以用于构造类对象。这些输入之一应该是数字形式。如果没有输入数字,它会中断开关并最终终止程序。我想设置一个 while(){} 条件,这样如果输入非整数,它会提示用户输入一个整数,然后继续执行程序。

int main(){
  int in_yob, ranking;
  string in_first_name, in_last_name, in_genre, in_fact, last_name, in_composer;
  char selection, choice;
    do {
      DisplayMenu();
      cin >> selection;
      cout << endl;
      while (!cin || selection < 48 || selection > 53){
        cin.clear();
        cout << "Please make a valid selection" << endl;
        DisplayMenu();
        cin >> selection;
      }
      switch (selection) {
        case 49 : {
            cout << "First Name: ";
            cin >> in_first_name;
            cout << "Last Name: ";
            cin >> in_last_name;
            cout << "Genre: ";
            cin >> in_genre;
            cout << "Year of Birth: ";
            cin >> in_yob;
            cout << "Fact: ";
            cin >> in_fact;
            last_name = in_last_name;
            transform(last_name.begin(), last_name.end(), last_name.begin(), ::tolower);
            Composer& last_name = myDB.AddComposer(in_first_name, in_last_name,
                                                        in_genre, in_yob, in_fact);
            cin.clear();
        }   break;
...
        default: 
            cout << "Please make a valid selection" << endl;
      }
  } while (selection != 48);
}

我试过在 cin >> in_yob; 之后插入一个 while 循环:

while(!cin || in_yob > 1){
    cin.clear();
    cout << "Enter a positive enter for year of birth: ";
    cin >> in_yob;
}

但结果是无限循环“Enter a positive enter for year of birth:”。我知道这种用于错误检查的构造在 switch case 之外工作,那么在 switch case 中我得到这个结果的原因是什么?另外,您将如何解决这个问题,以便我可以检查并防止输入错误?谢谢。

最佳答案

[为了用比在评论中更多的空间和更好的格式来解释我自己,我将其发布为答案而不是评论。]

当你输入输入的时候,比如

1

输入缓冲区实际上包含两个字符,第一个是数字'1',然后是换行符'\n'

当您读取单个字符时,输入操作会提取第一个字符,即数字,并将其写入您的变量。

如果您随后读取另一个字符,它将读取换行符,而不是后面的任何内容。

有一个技巧可以“忽略”字符,例如换行符,这是通过使用 std::istream::ignore 来完成的。 ,如果您点击引用链接,您将看到一个很好的示例,说明如何忽略包括换行符在内的任何内容。

因此,在您的情况下,仅调用 clear 是不够的,您还需要在输入验证循环中调用 ignore 。如果继续读取单个字符,则还需要在此之前调用 ignore

关于c++ - 使用 while 循环检查 switch case 中的输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31434923/

相关文章:

c++ - 具有多个框架/页面的 QWebView 共享相同的 session 数据

c++ - 继承模板类的构造函数

c++ - 有哪些可用于 C++ 的垃圾收集器?

java - 计算最后一列素数

php - 第二个 while 循环没有运行。为什么?

c++ - 如何保持 QtreeWidget(多于 2 列)第二列的大小动态?

php - PHP-包含或要求在oop的类文件中不起作用

c++ - 多重继承和数据成员

c# - 继承:为什么改变一个对象的类型被认为是糟糕的设计?

c++ - Char数据类型和while循环