使用 cin.fail() 表示整数与地板

using cin.fail() for integer vs floor

本文关键字:整数 表示 cin fail 使用      更新时间:2023-10-16

如果输入不是整数,我想接受用户输入并退出程序。我检查了一本书中的程序: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 integern";
}

通常,读取整数并在遇到不适合整数的字符时停止是理想的成功定义。如果需要最自定义的定义,可以从此功能构建它,并查看流中的下一个内容。std::istream::peek()成员查看下一个字符而不提取它。如果出现故障,例如,流处于故障模式(即,它已设置std::ios_base::failbitstd::ios_base::badbit)或到达文件末尾,则返回std::char_traits<char>::eof()。由于流在此操作之前是正常的,因此唯一可能的故障是到达文件末尾。然后,您可以考虑遇到的任何角色并确定是否要接受它。该示例将空格和','视为可行的分隔符。请注意,下一个字符尚未提取,即您可能希望删除它,例如,使用 std::cin.ignore() .