簡體   English   中英

cin對bool的意外行為

[英]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工作方式,總共消耗了long0 > false1 > 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM