使用cin.fail()表示整数与楼层

时间:2013-11-10 14:47:16

标签: c++ iostream cin

如果输入不是整数,我想接受用户输入并退出程序。我查了一本书中的程序:http://homepages.gac.edu/~mc38/2013J/code/bookCode/ch03/elevator2.cpp

它说使用cin.fail()我可以检查一下。但即使输入楼层类型值,程序也不会退出。例如如果我输入2.5,则输出为2,而不是我的错误消息“非整数”。

1 个答案:

答案 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::failbitstd::ios_base::badbit)或已达到文件末尾。由于在此操作之前流是正常的,唯一可能的故障是到达文件的末尾。然后,您可以考虑遇到的任何字符,并确定是否要接受它。该示例将空格和','视为可行的分隔符。请注意,未提取下一个字符,但是,您可能希望使用例如std::cin.ignore()来删除它。