C++中的输入错误检查
Input Error Checking in c++
int x; // intitialize x but don't immediately prompt for input. This makes the program more user friendly
cout << "Enter a year to check if it's a leap year: " << endl;
cin >> x;
while (cin.fail()) // check for input error
{
cin.clear();
cin.ignore();
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
}
我无法理解失败状态在 C++ 中的工作原理。我想要发生的是,如果用户输入除数字之外的任何内容,它将清除缓冲区并提示进行另一个输入。我的代码似乎无法做到这一点。如果我输入类似 say, r4 的内容,那么我的其余代码(工作得很好,所以我没有在下面显示)将 运行 与四个。似乎循环在某个时候被激活了。 cout 字符串仍然被打印出来。只是它没有给我机会重新输入并继续检查。
cin.good()
或 cin.fail()
将让您知道它是否可以处理输入(有效。)cin.clear()
如果需要清除错误状态。
cin >> x;
cin
检查缓冲区中是否有任何内容。缓冲区是空的,所以它一直等到用户按下 return,然后将所有内容复制到它的缓冲区 (r4
)。然后它尝试从缓冲区加载到 int
。第一个字节是 r
,因此它设置流的失败状态并中止。 r4
保留在缓冲区中。
cin.clear();
这会清除失败状态,r4
保留在缓冲区中。
cin.ignore();
这将忽略缓冲区中的第一个字符。 4
保留在缓冲区中。
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
cin
检查缓冲区中是否有任何内容, 并且有 (4
),因此它尝试从缓冲区加载到 int
,如您所见,它会成功并继续。
通常的解决方案是使用 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
,它会忽略该行的其余部分。
从http://en.cppreference.com/w/cpp/io/basic_ios/fail获得的以下table显示了影响istream::fail()
的return值的各种状态
鉴于此,您应该使用:
while (cin.fail()) // check for input error
{
if ( cin.eof() )
{
// Once EOF file has been reached with cin,
// you can't do much. Figure out a way to bail
// from the loop.
}
cin.clear();
// Also, ignore not just one character but till the end of the line.
// cin.ignore();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
}
int x; // intitialize x but don't immediately prompt for input. This makes the program more user friendly
cout << "Enter a year to check if it's a leap year: " << endl;
cin >> x;
while (cin.fail()) // check for input error
{
cin.clear();
cin.ignore();
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
}
我无法理解失败状态在 C++ 中的工作原理。我想要发生的是,如果用户输入除数字之外的任何内容,它将清除缓冲区并提示进行另一个输入。我的代码似乎无法做到这一点。如果我输入类似 say, r4 的内容,那么我的其余代码(工作得很好,所以我没有在下面显示)将 运行 与四个。似乎循环在某个时候被激活了。 cout 字符串仍然被打印出来。只是它没有给我机会重新输入并继续检查。
cin.good()
或 cin.fail()
将让您知道它是否可以处理输入(有效。)cin.clear()
如果需要清除错误状态。
cin >> x;
cin
检查缓冲区中是否有任何内容。缓冲区是空的,所以它一直等到用户按下 return,然后将所有内容复制到它的缓冲区 (r4
)。然后它尝试从缓冲区加载到 int
。第一个字节是 r
,因此它设置流的失败状态并中止。 r4
保留在缓冲区中。
cin.clear();
这会清除失败状态,r4
保留在缓冲区中。
cin.ignore();
这将忽略缓冲区中的第一个字符。 4
保留在缓冲区中。
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
cin
检查缓冲区中是否有任何内容, 并且有 (4
),因此它尝试从缓冲区加载到 int
,如您所见,它会成功并继续。
通常的解决方案是使用 cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')
,它会忽略该行的其余部分。
从http://en.cppreference.com/w/cpp/io/basic_ios/fail获得的以下table显示了影响istream::fail()
鉴于此,您应该使用:
while (cin.fail()) // check for input error
{
if ( cin.eof() )
{
// Once EOF file has been reached with cin,
// you can't do much. Figure out a way to bail
// from the loop.
}
cin.clear();
// Also, ignore not just one character but till the end of the line.
// cin.ignore();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
cout << "You entered an incorrect value. Try again" << endl;
cin >> x;
}