Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 每当我运行我的程序时,它就会进入一个无限循环,但只有当我输入一个无效的数字,然后输入一个字符或字符串时,它才会进入一个无限循环_C++_For Loop_While Loop_Infinite Loop - Fatal编程技术网

C++ 每当我运行我的程序时,它就会进入一个无限循环,但只有当我输入一个无效的数字,然后输入一个字符或字符串时,它才会进入一个无限循环

C++ 每当我运行我的程序时,它就会进入一个无限循环,但只有当我输入一个无效的数字,然后输入一个字符或字符串时,它才会进入一个无限循环,c++,for-loop,while-loop,infinite-loop,C++,For Loop,While Loop,Infinite Loop,在我的程序中,我试图验证用户的输入,确保他们唯一能输入的是1998-2019年间的数字。问题是,每当我首先输入一个数字(并且只输入一个数字)时,程序运行正常,但如果我输入一个无效的数字,然后输入一个字符或字符串,程序就会进入无限循环。每当我先键入字符或字符串,然后键入数字时,程序也会运行,但如果我在键入数字后键入字符,它将进入无限循环。有人知道为什么会发生这种情况,或者有可能的解决办法吗 这是导致问题的代码: while (userInputYear < 1998 &&

在我的程序中,我试图验证用户的输入,确保他们唯一能输入的是1998-2019年间的数字。问题是,每当我首先输入一个数字(并且只输入一个数字)时,程序运行正常,但如果我输入一个无效的数字,然后输入一个字符或字符串,程序就会进入无限循环。每当我先键入字符或字符串,然后键入数字时,程序也会运行,但如果我在键入数字后键入字符,它将进入无限循环。有人知道为什么会发生这种情况,或者有可能的解决办法吗

这是导致问题的代码:

   while (userInputYear < 1998 && userInputYear != -99 || userInputYear > 2019)
    {
        cout << "\nPlease enter an integer between 1998 and 2019: ";
    
        while (!(cin >> userInputYear)) 
        {
            cin.clear();
            cin.ignore(1000, '\n');
            cout << "\nPlease enter an integer between 1998 and 2019: ";
        }
    }
while(userInputYear<1998&&userInputYear!=-99 | | userInputYear>2019)
{
cout>userInputYear)
{
cin.clear();
cin.忽略(1000,“\n”);

cout在第二个while循环中,您将进入无限循环,因为缓冲区中还有无效字符。当cin遇到无效字符时,它将进入错误状态,发生这种情况时,您必须: 1.您必须测试此错误状态。 2.您必须清除错误状态。 3.您必须或者处理生成错误状态的输入数据,或者将其清除并重新提示用户。 像这样的事情对我来说更合适:

while (userInputYear < 1998 && userInputYear !=-99 || userInputYear > 2019)
    {
        cout << "Please enter an integer between 1998 and 2019: ";
        while(!(cin >> userInputYear)) {
          cin.clear();
          cin.ignore(1000, '\n');
          cout << "Please enter an integer between 1998 and 2019: ";
        }
        cout << endl;
    }
while(userInputYear<1998&&userInputYear!=-99 | | userInputYear>2019)
{
cout>userInputYear){
cin.clear();
cin.忽略(1000,“\n”);

cout在第二个while循环中,您将进入无限循环,因为缓冲区中还有无效字符。当cin遇到无效字符时,它将进入错误状态,发生这种情况时,您必须: 1.您必须测试此错误状态。 2.您必须清除错误状态。 3.您必须或者处理生成错误状态的输入数据,或者将其清除并重新提示用户。 像这样的事情对我来说更合适:

while (userInputYear < 1998 && userInputYear !=-99 || userInputYear > 2019)
    {
        cout << "Please enter an integer between 1998 and 2019: ";
        while(!(cin >> userInputYear)) {
          cin.clear();
          cin.ignore(1000, '\n');
          cout << "Please enter an integer between 1998 and 2019: ";
        }
        cout << endl;
    }
while(userInputYear<1998&&userInputYear!=-99 | | userInputYear>2019)
{
cout>userInputYear){
cin.clear();
cin.忽略(1000,“\n”);

无法读取文本行,然后将该文本放入
std::istringstream
,并尝试从该字符串流中提取所需的值。这样,您就不会遇到任何问题,因为无效输入仍然留在
std::cin
的输入缓冲区中(这就是您现在遇到的问题)。首先,它永远不会进入第一个while循环。其次,当您将字符读入整数时,cin上的失败位被设置。也就是说,您永远无法从流中读取,它将始终返回,因为每次无效输入时它都会失败。因此,循环是无限的。读取文本行,然后将该文本放入
std::istringstream
并尝试从该字符串流中提取所需的值。这样,您就不会遇到无效输入仍留在
std::cin
的输入缓冲区中的任何问题(这就是您现在遇到的问题)。首先,它永远不会进入第一个while循环。其次,当您将字符读入整数时,cin上的失败位被设置。也就是说,您永远无法从流中读取,它将始终返回,因为每次无效输入时它都会失败。因此是无限循环。当我使用它来防止无限循环时,我不再能够重复“请输入一个1998到2019之间的整数:”。我删除了第一个while循环,因为user3389943通知我它从未经过该循环。目前我只有您在validate()中修改的while语句。该程序当前显示:`全国锦标赛查询读取输入文件…输入1998-2019年之间的年份以查找冠军(按-99停止):abc请输入1998-2019年之间的整数:abc'因此我使用了它,但仍然不成功。当我运行该程序时,“请输入1998-2019年之间的整数:重复两次。然后我创建了另一个代码:while((!(cin>>userInputYear))&&(userInputYear<1998)&&(userInputYear!=-99)| |(userInputYear>2019)){cin.clear();cin.ignore(1000),\n');我是否可以编辑我的原始问题,以便更清楚地了解我的程序当前的样子。但我将原始代码保留在“完整程序”中。我认为值得注意的是,在我更新的代码中,如果我输入-99两次,程序将结束。我感觉就像!(cin>>userInputYear)可能做了一些奇怪的事情,但我不确定为什么或如何修复它。当我使用它来防止无限循环时,我不再能够重复“请输入1998到2019之间的整数:”。我删除了第一个while循环,因为用户3389943通知我它从未经过该循环。目前我只有您在validate()中修改的while语句。程序当前显示:`全国锦标赛查询读取输入文件…输入1998-2019年之间的年份以查找冠军(按-99停止):abc请输入一个1998年到2019年之间的整数:abc'所以我使用了它,但仍然不成功。当我运行程序时,“请输入1998年到2019年之间的整数:”重复了两次。然后我创建了另一个代码:while((!(cin>>userInputYear))&&(userInputYear<1998)和(&(userInputYear!=-99)| |(userInputYear>2019)){cin.clear();cin.ignore(1000,“\n”);我是否可以编辑我的原始问题,以便更清楚我的程序当前的样子。但我将原始代码保留在“完整程序”中。我认为值得注意的是,在我更新的代码中,如果我输入-99两次,程序将结束。我感觉像!(cin>>userInputYear)可能做了一些奇怪的事情,但我不确定为什么或如何修复它。