使用 cin.fail() 表示整数与地板
using cin.fail() for integer vs floor
如果输入不是整数,我想接受用户输入并退出程序。我检查了一本书中的程序: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::failbit
或std::ios_base::badbit
)或到达文件末尾,则返回std::char_traits<char>::eof()
。由于流在此操作之前是正常的,因此唯一可能的故障是到达文件末尾。然后,您可以考虑遇到的任何角色并确定是否要接受它。该示例将空格和','
视为可行的分隔符。请注意,下一个字符尚未提取,即您可能希望删除它,例如,使用 std::cin.ignore()
.
相关文章:
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 如何更好地表示 6 个整数键而不是作为 6 维数组的索引?
- 浮点数中整数的精确表示形式
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 给定一个整数,将其表示为平方和
- 整数文本太大,无法用任何整数类型表示--C++
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 如何在以 256 为基数的唯一 xLen-digit 表示中写一个整数 x?
- 升序,三个整数表示C++
- 编译器C++如何在二进制代码中表示整数
- 使用具有整数表示和 ULP 的混叠正确比较双精度
- Excel 2010与Excel 2003中的整数表示法(C++插件)
- 将ColedateTime转换为tick或整数表示
- Codekata将数字从十六进制转换为十进制整数表示形式
- 获取boost::gregori::date的整数表示形式
- 如何得到GF(2^n)中元素的整数表示
- 如何将整数表示为二进制以便使用异或进行比较
- 安全派生指针的整数表示形式
- 指针的整数表示形式