我需要使用cin从用户读取int,但如果输入字符串则输出错误消息。我一直试图使用带有cin.fail()
的if语句使其工作,如果只输入字符,则该语句很有效。但是,如果用户输入类似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并根据它是否失败或成功打印出消息但是如何在程序中使用类型转换错误?
答案 0 :(得分:1)
数值成功的格式化输入是否有包含数字的前缀。流不会轻易地允许您更改该行为(您可以通过使用专门的std::num_get<char>
方面来改变该行为,但我不会将其归类为简单)。最简单的方法可能是检查下一个字符(如果有的话)是否恰好是一个空格(并且不要使用fail()
;你应该只使用转换为布尔值):
if (std::cin && (std::isspace(std::cin.peek()) || std::cin.eof())) {
...
}
此外,不将条件中的布尔值与true
或false
进行比较:结果不会因此而变得更加布尔。< / p>