如果输入不是整数,我想接受用户输入并退出程序。我查了一本书中的程序:http://homepages.gac.edu/~mc38/2013J/code/bookCode/ch03/elevator2.cpp
它说使用cin.fail()
我可以检查一下。但即使输入楼层类型值,程序也不会退出。例如如果我输入2.5,则输出为2,而不是我的错误消息“非整数”。
答案 0 :(得分:0)
这里的问题是字符序列2.5
显然以有效整数开头,即2
。这是流成功读取的内容。因此,在阅读2
之后,流没有理由失败。
你可以处理这种情况的一种方法是读取一个整数,如果这是成功的,检查导致读操作停止的字符:如果这个字符是一个合适的分隔符,例如一个空格,那么结束文件等,您认为输入成功:
bool is_integer_separator(int value) {
return value == std::char_traits<char>::eof() // at the end of the file
|| value == ',' // accept comma as separator
|| std::isspace(static_cast<unsigned char>(value)); // ... and space
}
// ...
int value;
if (std::cin >> value && is_integer_separator(std::cin.peek())) {
...
}
else {
std::cout << "Not an integer\n";
}
通常,读取整数并在遇到不符合整数的字符时停止是成功的理想定义。如果您需要最自定义的定义,则可以通过此功能构建它,同时查看流中接下来的内容。 std::istream::peek()
成员查看下一个字符而不提取它。如果出现故障,它将返回std::char_traits<char>::eof()
,例如,流处于故障模式(即,它已设置std::ios_base::failbit
或std::ios_base::badbit
)或已达到文件末尾。由于在此操作之前流是正常的,唯一可能的故障是到达文件的末尾。然后,您可以考虑遇到的任何字符,并确定是否要接受它。该示例将空格和','
视为可行的分隔符。请注意,未提取下一个字符,但是,您可能希望使用例如std::cin.ignore()
来删除它。