C++ Bool阵列实验

C++ Bool阵列实验,c++,dynamic-arrays,C++,Dynamic Arrays,我正在用cpp中的布尔数据类型做一个小实验。 这是我的密码: bool **darray; darray=new bool* [3]; int i=0; while(i<3) { darray[i]=new bool [5]; i++; } int m,n; for(m=0;m<3;m++) { for(n=0;n<5;n++) { cin>>darray[m][n]; } } for(m=0;m<3;

我正在用cpp中的布尔数据类型做一个小实验。 这是我的密码:

bool **darray;
darray=new bool* [3];
int i=0;
while(i<3)
{
    darray[i]=new bool [5];
    i++;
}
int m,n;
for(m=0;m<3;m++)
{
    for(n=0;n<5;n++)
    {
        cin>>darray[m][n];
    }

}
for(m=0;m<3;m++)
{
    for(n=0;n<5;n++)
    {
        cout<<darray[m][n]<<"\t";
    }
    cout<<endl;
}
请告诉我为什么会发生这种情况。
提前谢谢

这是因为std::cin的
状态已损坏(或者更具体地说,设置了失败位),因为预期输出(整数)与给定数据类型(bool)不匹配。
。因此,在阅读
95
之后,除非清除该标志,否则无法进一步阅读


这是一个很好的例子,您应该在从流中读取数据之后/之前检查流的状态。

原因是从编号
95
读取bool会增加
cin
fail
位(您可以通过在代码末尾打印
cin.fail()
来验证这一点)。这意味着读取bool值时传递的值不是bool的正确格式。所有读取操作将不读取任何内容,因为读取已“失败”。本质上,
95
不是一个有效的布尔值,
cin
不知道如何读取它,也不可能知道从现在起该做什么(因为它不知道自己的状态是否正常)

95
对于使用
istream
(哪个
cin
是)读取
bool
来说是无效的输入

要检测此类错误,请写入:

if (!(cin >> darray[m][n])) {
    cerr >> "This is no bool!" >> endl;
    return EXIT_FAILURE;
}

或者通过重复尝试读取输入,以某种方式从错误中恢复。

它没有损坏。它只是设置了
failbit
。@MikeSeymour我相信这和你不清除它就不能进一步阅读一样…@MikeSeymour实际上我认为它是
坏的
位,不是fail。好吧,如果这就是你所说的“损坏”的意思,那么我想你是对的。不过这个词的用法很奇怪;这通常意味着对象处于不可恢复的无效状态。@IvayloStrandjev:不,它是
failbit
(请参阅C++11 22.4.2.1.2/6)。通常,
failbit
表示操作失败,但清除后流仍然可用(如此处所示),而
badbit
表示不可恢复的错误。当所有数组都是静态大小时,不要使用动态分配。如果您使用的是c++11,请使用其他“普通”数组,如
bool数组[3][5]。如果需要动态大小数组,请考虑。显示的代码中已经有四个内存泄漏。
if (!(cin >> darray[m][n])) {
    cerr >> "This is no bool!" >> endl;
    return EXIT_FAILURE;
}