cin对bool的意外行为

时间:2014-07-22 04:57:38

标签: c++

我正在尝试使用cin在bool类型数组中输入。如果输入类似于0111100010001000而不是为所有迭代运行(在我的输入中它是16)它终止并打印一些垃圾值,但如果输入像0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0那样,它按预期工作。 / p>

#include<cstdio>
#include<cstring>
#include<iostream>

#define FRND 2001

using namespace std;

int main(){
    bool mutualFriend[FRND][FRND];
    int noOfFriends = 0;
    cin >> noOfFriends;
    for (int i = 0; i < noOfFriends ; i++){
        for (int j = 0; j < noOfFriends; j++){
            cin >> mutualFriend[i][j];
        }
    }
    for (int i = 0; i < noOfFriends ; i++){
        for (int j = 0; j < noOfFriends; j++){
            cout << mutualFriend[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

cin.clear()可以解决我的问题。

请解释为什么在第一个场景中跳过循环。

3 个答案:

答案 0 :(得分:3)

operator>>解析bool参数输入的方式在标准的§22.4.2.1.2[facet.num.get.virtuals] / p6中指定:

  

如果(str.flags()&ios_base::boolalpha)==0,则输入继续进行   会long,但如果某个值存储到val,   该值根据以下内容确定:如果值为   存储为0,然后存储false。如果值为1,则为true   被储存了。否则true将被存储,ios_base::failbit将被存储   分配给错误。

因此,如果你给它0111100010001000,它会首先尝试将其解析为long,给你一个大数字(显然不是1)。然后,处理的第二步会将true存储到要设置的boolfailbit中。

答案 1 :(得分:1)

cin有空格作为默认分隔符,所以当你从值10101读取它时,它认为它只是一个大的int。

而是使用.get()来读取单个字符

for (int i = 0; i < noOfFriends ; i++){
    for (int j = 0; j < noOfFriends; j++){
        mutualFriend[i][j] = (cin.get() == '1');
    }
}

答案 2 :(得分:1)

T.C。已经解释了流式传输到bool的工作方式,简要地说消费了long0 - &gt; false1 - &gt; true,否则为true,但设置为failbit

对于一般数字输入,C ++对于十进制输入有std::dec,对于八进制有std::oct(基数为8),对于十六进制有std::hex(基数为16),但奇怪的是没有二进制。不可能将数字的多位二进制表示直接读入整数类型。

您需要做的是一次读取一个字符,然后自己转换为二进制文件:

`char c;`

...

    if (cin >> c && (c == '0' || c == '1'))
        mutualFriend[i][j] == c != '0';
    else
        throw std::runtime_error("failure to parse binary digit from stream");