5

好的,所以我对 C++ iostreams 有一些感觉很奇怪的问题,但考虑到 MSVC++ 和 G++ 都会发生这种情况,这可能是已定义的行为。

说我有这个程序:

#include <iostream>
using namespace std;

int main()
{
   int a;
   cin >> a;
   cout << a << endl;
   cin >> a;
   cout << a << endl;

   return 0;
}

如果我故意通过给第一个 cin 一个大于 int 的最大限制的值来溢出,所有进一步的调用cin.operator>>()将由于某种原因立即返回,并a设置为某个值。该值似乎未定义。

为什么,这种行为记录在哪里?有没有办法确定是否发生了这种溢出?

此外,这个类似的程序似乎可以按我的意图工作。如果我溢出该值,它会给出a一些值,并继续,就好像溢出从未发生过一样。

#include <cstdio>
using namespace std;

int main()
{
   int a;
   scanf("%d", &a);
   printf("%d\n", a);
   scanf("%d", &a);
   printf("%d\n", a);
   scanf("%d", &a);
   printf("%d\n", a);

   return 0;
}
4

3 回答 3

7

iostreams 旨在检测错误并进入错误状态。整数溢出与输入非数字字符串的结果相同。

cin将(或任何流)投射到bool或检查cin.rdstate()以确定是否发生了错误。

调用cin.clear()cin.ignore()清除错误。它将在失败的角色处拾取。

至于官方文档,不幸的是,标准在 iostreams 的内部有点难以理解。请参阅 §27.6.1.2.1、27.6.1.2.2 和 22.2.2.1.1/11(不开玩笑):

— 在第 2 阶段累积的字符序列会导致 scanf 报告输入失败。ios_base::failbit 分配给 err。

scanf的文档同样难以理解,我相信溢出应该是一个错误。

于 2010-08-27T08:43:11.930 回答
1

我认为 cin 由于读取无效而将自身设置为错误状态。

这里的第一个回复解释了它。

http://www.dreamincode.net/forums/topic/93200-cin-checking-and-resetting-error-state/

刚刚尝试了这段代码,它似乎确实设置为失败状态

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    if(!cin)
    {
        cin.clear();
    }
    cout << a << endl; 
    cin >> a; 
    if(!cin)
    {
        cin.clear();
    }
    cout << a << endl; 

    return 0; 
}
于 2010-08-27T08:42:57.457 回答
0

a以未定义的值开始。这不是cin错。尝试:

if (cin >> a) {
  cout << a endl;
}

使用前会检查读入是否a成功a

于 2010-08-27T08:44:14.877 回答