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

Using a while loop to check for input errors within a switch case

我有一个开关,其中一种情况要求用户提供多个输入以用于构建 class 对象。这些输入之一应该是数字形式。如果没有输入数字,它会中断开关并最终终止程序。我想设置一个 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 中我得到这个结果的原因是什么?另外,您将如何解决这个问题,以便我可以检查并防止输入错误?谢谢

您需要清除输入流。

#include <iostream>
#include <string>
int in_yob = 0;
int main()
{
    while(std::cin.good() && in_yob < 1){
        std::cin.clear();
        std::cout << "Enter a positive enter for year of birth: ";
        if( !(std::cin >> in_yob) ) {
            std::cin.clear();
            std::cin.ignore(10000,'\n');
        }
    }
    std::cout << "YOB " << in_yob << std::endl;

}

[为了用更多 space 和比评论更好的格式来解释我自己,我 post 这是一个答案而不是评论。]

当您输入输入时,例如

1

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

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

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

"ignore" 个字符有一个技巧,例如换行符,这是通过使用 std::istream::ignore 完成的,如果您按照 link 到参考您将看到一个很好的示例,说明如何忽略包括换行符在内的所有内容。

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