【问题标题】:cin fail flag for putting strings into ints用于将字符串放入整数的 cin 失败标志
【发布时间】:2014-04-06 00:56:29
【问题描述】:

我需要使用 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 并根据它是失败还是成功打印出消息,但是如何在程序中使用类型转换错误?

【问题讨论】:

  • 你的意思是int s1而不是string吗?
  • 是的,对不起。现在改了

标签: c++ error-handling casting cin


【解决方案1】:

数字值的格式化输入成功是有一个包含数字的前缀。流不会轻易让您更改该行为(您可以通过使用专门的std::num_get&lt;char&gt; facet 更改该行为,但我不会将其归类为简单)。最简单的方法可能是检查下一个字符(如果有的话)是否恰好是空格(并且不要使用fail();您应该只使用转换为布尔值):

if (std::cin && (std::isspace(std::cin.peek()) || std::cin.eof())) {
    ...
}

另外,不要将条件中的布尔值与truefalse 进行比较:这样做不会使结果变得更加布尔值。

【讨论】:

    猜你喜欢
    • 2013-01-11
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2022-01-17
    • 2021-12-15
    相关资源
    最近更新 更多