【问题标题】:cin and boolean inputcin 和布尔输入
【发布时间】:2014-11-29 22:59:17
【问题描述】:

我是 C++ 新手,我想知道函数 cin 在布尔数据的情况下如何工作。 比如说:

bool a;
cin >> a;

我明白,如果我给出 0 或 1,我的数据 a 将是真或假。 但是如果我给另一个整数甚至一个字符串会发生什么?

我正在编写以下代码:

#include <iostream>

using namespace std;

int main()
{
    bool aSmile, bSmile;
    cout << "a smiling ?" << endl;
    cin >> aSmile;
    cout << "b smiling ?" << endl;
    cin >> bSmile;
    if (aSmile && bSmile == true)
        cout << "problem";
    else
        cout << "no problem";
    return 0;
}

如果我为两个布尔值都给出 0 或 1 的值,则没有问题。 但是如果我给另一个整数,这里是输出:

a smiling ?
9
b smiling ?
problem

我没有被要求为 bSmile 输入任何值,cin &gt;&gt; bSmile 行似乎被跳过了。 如果我给 aSmile 一个字符串值,也会发生同样的情况。

发生了什么?

【问题讨论】:

标签: c++ boolean cin


【解决方案1】:

来自cppreference

如果v的类型为bool且未设置boolalpha,则如果要存储的值为0​,则存储false,如果要存储的值为@987654328 @, true 被存储,对于任何其他值,std::ios_base::failbit 被分配给 err 并且 true 被存储。

由于您输入的值不是01(甚至不是"true""false"),因此流在其流状态中设置了一个错误位,从而阻止您执行任何进一步的输入。

clear() 应该在读入bSmile 之前被调用。此外,这也是为什么您应该始终检查您的输入是否在流本身的条件下成功的一个很好的理由。

【讨论】:

  • 值得补充的是,您可以使错误更加明显,但有异常:cplusplus.com/reference/ios/ios/exceptions
  • 非常感谢。在 bSmile 输入之前使用 cin.clear 它适用于其他整数,但它仍然不适用于字符串!
  • @Xema "Not working" 很模糊,需要展示代码和行为。
  • 我只是在上面代码中的“cin >> aSmile”之后添加了 cin.clear()。并且有字符串输入,结果和没有cin.clear()的结果是一样的(上图可以看到)
  • @Xema 我知道的唯一方法是覆盖std::num_get 设施并合并该自定义功能。要么将值读入字符串并解析正确的值。
【解决方案2】:

不,您不能输入布尔值,尽管您尝试输入时不会出错,但程序不会暂停让您输入布尔变量的值。相反,它会跳过它。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
相关资源
最近更新 更多