2014-07-22 27 views
1

我正在嘗試使用cin在bool類型的數組中輸入數據。如果給出的輸入類似0111100010001000它不是爲所有迭代運行(在我的輸入中爲16),它會終止並打印一些垃圾值,但如果給出如0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0那樣的輸入,它將按預期工作。bin的cin的意外行爲

#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

順便說一下,如果每行的大小在編譯時是已知的,可以使用數組'std :: bitset',爲此實際提供了一個合適的提取操作符。 –

回答

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被分配給err的 。

因此,如果你給它0111100010001000它會首先嚐試解析它作爲一個long,給你一個大的數字(即明顯不1)。然後處理的第二步導致true被存儲到要設置的boolfailbit中。

+0

如果'011100010001000> LONG_MAX',那麼在進入第二步之前它可能會失敗(我認爲) –

+0

@MattMcNabb它會失敗,但它仍然會到第二步 - 「長」轉換將設置「failbit」和存儲'LONG_MAX',它既不是0也不是1,將會導致'true'被存儲,'failbit'被設置。所以在實踐中沒有區別。 –

1

cin有空格作爲默認分隔符,所以當你從值10101讀取時,它認爲它只是一個大的整數。

而是使用獲得()讀取單個字符

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

T.C.已經解釋了流入到bool工作的方式,總計消耗long0false,1true,否則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");