0

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

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

4

1 回答 1

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().

于 2013-11-10T15:26:55.203 回答