我正在尝试使用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()
可以解决我的问题。
请解释为什么在第一个场景中跳过循环。
答案 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
存储到要设置的bool
和failbit
中。
答案 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
的工作方式,简要地说消费了long
,0
- &gt; false
,1
- &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");