C++ 如何捕获无效的用户输入
我不理解Try、throw、catch语句,我想知道,当代码中的所有输入都应该是int时,为什么捕获一个char是最好的选择。这是为了帮助人们避免在我询问他们最喜欢的数字时愚蠢地输入“a”。下面是我试图保护的代码的一个示例,当我需要int时,有人输入char:C++ 如何捕获无效的用户输入,c++,C++,我不理解Try、throw、catch语句,我想知道,当代码中的所有输入都应该是int时,为什么捕获一个char是最好的选择。这是为了帮助人们避免在我询问他们最喜欢的数字时愚蠢地输入“a”。下面是我试图保护的代码的一个示例,当我需要int时,有人输入char: int a, b; std::cout << "Enter a Numerator: "; std::cin >> a; std::cout << "Enter a Denominator: "; st
int a, b;
std::cout << "Enter a Numerator: ";
std::cin >> a;
std::cout << "Enter a Denominator: ";
std::cin >> b;
inta,b;
std::cout>a;
std::cout>b;
如果您将两个问题中的两个答案合并在一起(和),我在您的问题的评论部分提到了这一点,您将得到:
#include <iostream>
int main()
{
int a, b;
std::cout << "Enter a Numerator: ";
std::cin >> a;
std::cout << "Enter a Denominator: ";
std::cin >> b;
if (!std::cin.good())
{
throw std::invalid_argument( "received strings. Need integers" );
}
}
为了更细粒度地控制输入例程,您需要学习使用流状态
goodbit、eofbit、badbit和failbit
。您可以直接使用或使用方便的成员函数.good()、.eof()、.bad()和.fail()检查状态,请参阅
检查.good()
会告诉您输入正确,但它不能帮助您从失败的输入或错误条件或EOF
中恢复。为此,您必须单独检查发生的错误情况
继续我的评论并添加一点细节,您可以执行以下操作(您对a
和b
执行相同的操作,您可以移动到函数或成员函数),例如
用户在Linux上使用Ctrl+d(或在windows上使用Ctrl+z)取消输入
仔细检查一下,如果您有问题,请告诉我。为了避免什么,确切地说?我将永远看到这一点的可能重复。用户键入字符和字符串,而不是整数。将输入作为字符串读取并进行您自己的验证。或者最好查看一下。当谈论cin
时,处理错误的最佳方法是if(!(std::cin>>a))
然后检查是否发生了不可恢复的错误,例如eofbit
或badbit
设置为如果(std::cin.eof()| std::cin.bad())
或是否发生了可恢复的错误,例如设置了failbit
,使用else检查是否(std::cin.fail())
之后std::cin.clear()可以调用code>来清除故障位
。谢谢,这是一个巨大的帮助。我想我已经开始理解试球、掷球和接球的指令了。我只需要从另一个角度看它。非常感谢。很高兴能帮上忙。:)
if (b /*assuming b is denominator*/ == 0) {
throw std::overflow_error("Divide by zero exception");
}
#include <iostream>
#include <limits>
int main (void) {
int a, b;
/* get input for a */
while (1) /* loop continually reading input */
{
std::cout << "\nenter an integer for a: ";
if (! (std::cin >> a) ) { /* check stream state */
/* if eof() or bad() break read loop */
if (std::cin.eof() || std::cin.bad()) {
std::cerr << "(user canceled or unreconverable error)\n";
goto unrecoverable;
}
else if (std::cin.fail()) { /* if failbit */
std::cerr << "error: invalid input.\n";
std::cin.clear(); /* clear failbit */
/* extract any characters that remain unread */
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
'\n');
}
}
else { /* on succesful read, just output int and break loop */
std::cout << "integer a: " << a << '\n';
/* extract any characters that remain unread */
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
'\n');
break;
}
}
/* same thing for b */
while (1) /* loop continually reading input */
{
std::cout << "\nenter an integer for b: ";
if (! (std::cin >> b) ) { /* check stream state */
/* if eof() or bad() break read loop */
if (std::cin.eof() || std::cin.bad()) {
std::cerr << "(user canceled or unreconverable error)\n";
break;
}
else if (std::cin.fail()) { /* if failbit */
std::cerr << "error: invalid input.\n";
std::cin.clear(); /* clear failbit */
/* extract any characters that remain unread */
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
'\n');
}
}
else { /* on succesful read, just output int and break loop */
std::cout << "integer b: " << b << '\n';
/* extract any characters that remain unread */
std::cin.ignore(std::numeric_limits<std::streamsize>::max(),
'\n');
break;
}
}
unrecoverable:;
}
$ ./bin/cin_validate_ab
enter an integer for a: no
error: invalid input.
enter an integer for a: OK
error: invalid input.
enter an integer for a: 5, I entered 5!
integer a: 5
enter an integer for b: again!
error: invalid input.
enter an integer for b: 6
integer b: 6
$ ./bin/cin_validate_ab
enter an integer for a: (user canceled or unreconverable error)