如果输入不是整数,我想接受用户输入并退出程序。我从一本书中检查了一个程序:http: //homepages.gac.edu/~mc38/2013J/code/bookCode/ch03/elevator2.cpp
它说使用cin.fail()
我可以检查这个。但是即使我输入楼层类型值,程序也不会退出。例如,如果我输入 2.5,则输出为 2,而不是我的错误消息“不是整数”。
如果输入不是整数,我想接受用户输入并退出程序。我从一本书中检查了一个程序:http: //homepages.gac.edu/~mc38/2013J/code/bookCode/ch03/elevator2.cpp
它说使用cin.fail()
我可以检查这个。但是即使我输入楼层类型值,程序也不会退出。例如,如果我输入 2.5,则输出为 2,而不是我的错误消息“不是整数”。
这里的问题是字符序列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()
.