我正在使用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;
}
我知道对于任何非零输入,存储的结果将为1。 但是当我输入大于1的任何数字时,存储在数组中的数字为1,数组的其余元素设置为0并且for循环停止。 例如,如果我在for循环的第一次迭代中输入数字95,则输出为:
95
1 0 0 0 0 //
0 0 0 0 0 // This is output
0 0 0 0 0 //
请告诉我为什么会这样。 提前致谢。
答案 0 :(得分:1)
这是因为state of std::cin is getting corrupted ( Or more specifically it's fail bit is set) as expected output (integer) doesn't match given data type (bool)
。因此,在阅读95
后,除非您清除该标记,否则无法进一步阅读
这是一个很好的例子,您应该在从中读取数据之后/之前检查流的状态。
答案 1 :(得分:1)
这样做的原因是从95
号码中读取一个bool会引发fail
的{{1}}位(您可以通过在cin
末尾打印cin.fail()
来验证你的代码)。这意味着读取bool值时传递的值不是bool的正确格式。所有阅读操作都不会读取任何内容,因为阅读已经“失败”。实质上95
不是一个有效的bool值,cin
不知道如何阅读它,并且不可能知道从这一刻开始该做什么(因为它无法知道它的状态是否合理) 。
答案 2 :(得分:0)
95
无法使用bool
(istream
)来阅读cin
。
要检测此类错误,请写:
if (!(cin >> darray[m][n])) {
cerr >> "This is no bool!" >> endl;
return EXIT_FAILURE;
}
或者通过重复尝试读取输入以某种方式从错误中恢复。