用于将字符串放入整数的 CIN 失败标志
cin fail flag for putting strings into ints
我需要使用 cin 从用户那里读取 int,但如果输入字符串,则打印错误消息。我一直在尝试使用它使用 if 语句和 cin.fail()
如果只输入字符,效果很好。但是,如果用户输入类似 3sadi
的内容,它似乎读取 3 并将字符串的其余部分留在缓冲区中,这不会给我错误消息,因为未设置 cin.fail() 标志。如果字符串的第一个字符是 int,我怎样才能使错误消息仍然打印?
int i1;
cin >> i1;
if (cin.fail() == true) {
cout << "error" << endl;
}
else{
cout << "success" << endl;
}
例如。 32
应该(并且确实)打印成功
red
应该(并且确实)打印错误
3x
应该打印错误,但打印成功并将 x 留在缓冲区中
如何使3x
给我错误消息?或者,我可以将其作为字符串读取并将其转换为 int 并根据它是否失败或成功打印出消息,但是您如何在程序中使用类型转换错误?
数值的格式化输入成功是有一个包含数字的前缀。流不会轻易允许您更改该行为(您可以使用专用std::num_get<char>
方面更改该行为,但我不会将其归类为简单)。最简单的方法可能是检查下一个字符(如果有的话)是否恰好是一个空格(并且不要使用fail()
;你应该只使用布尔值的转换):
if (std::cin && (std::isspace(std::cin.peek()) || std::cin.eof())) {
...
}
另外,不要将条件中的布尔值与true
或false
进行比较:这样做的结果不会变得更布尔。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- C++中的cin.ignore()函数不适用于整个流
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 如果一个人失败,如何防止多个CIN语句失败
- std::getline(std::cin, string) 可能因键盘输入失败的方式
- CIN >> 在较大的数字下失败,但对较小的数字有效?
- 在 cin 失败时捕获无效输入
- CIN 将字符串的开头分配给 int,仅在第二次调用中失败
- 在管道中调用时,从 std::cin 加载 pugi::xml_document 失败
- cin在尝试读取失败后读取零
- cin.当循环输入时失败
- 字符编码-当读取超过127个ASCII值时,C++cin失败
- 用于将字符串放入整数的 CIN 失败标志