2010-08-27 134 views
5

好吧,所以我有一些C++ iostreams的问题,感觉很奇怪,但它可能是定义的行为,考虑到MSVC++和G ++都会发生这种情况。为什么整数溢出会导致C++ iostreams错误?

说我有这个程序:

#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; 
} 

回答

7

输入输出流的目的是检测错误和输入错误状态。从输入非数字字符串开始,您可以得到与整数溢出相同的结果。

演员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。

documentation for scanf是一样难以逾越,我会认为溢出应该是一个错误。

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; 
} 
0

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

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

它会检查使用a

之前读入 a是否成功
相关问题