[英]Unexpected behaviour of cin for bool
我正在嘗試使用cin
輸入布爾類型數組。 如果輸入像0111100010001000
這樣給出,而不是運行所有迭代(在我的輸入中是16),它將終止並打印一些垃圾值,但是如果輸入像0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0
它按預期工作。
#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()
可以解決我的問題。
請解釋為什么在第一種情況下跳過循環。
標准的§22.4.2.1.2[facet.num.get.virtuals] / p6中指定了operator>>
解析bool
參數輸入的方式:
如果
(str.flags()&ios_base::boolalpha)==0
則輸入將long
,除非將值存儲在val
,該值根據以下確定:如果要存儲的值為0
然后存儲false
。 如果值為1
則存儲true
。 否則,將存儲true
並將ios_base::failbit
分配給err。
因此,如果給它0111100010001000
,它將首先嘗試將其解析為long
,從而為您提供一個很大的數字(顯然不是1
)。 然后,處理的第二步將true
存入bool
並設置failbit
。
cin的默認定界符為空格,因此當您從值10101中讀取時,它將視為一個大整數。
而是使用.get()讀取單個字符
for (int i = 0; i < noOfFriends ; i++){
for (int j = 0; j < noOfFriends; j++){
mutualFriend[i][j] = (cin.get() == '1');
}
}
TC解釋了流向bool
工作方式,總共消耗了long
, 0
> false
, 1
> true
,否則為true
但設置了failbit
。
對於常規數字輸入,C ++具有用於十進制輸入的std::dec
,用於八進制(基數8)的std::oct
,用於十六進制(基數16)的std::hex
,但是奇怪的是對於二進制數則沒有。 無法將數字的多位二進制表示形式直接讀取為整數類型。
您要做的就是一次讀取一個字符,然后自己轉換為二進制:
`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");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.