好的,所以我对C ++ iostream有一些问题感觉非常奇怪,但它可能是定义的行为,考虑到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;
}
答案 0 :(得分:7)
iostream用于检测错误并进入错误状态。从整数溢出中获得与输入非数字字符串相同的结果。
将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 :(得分: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;
}
答案 2 :(得分:0)
a
以未定义的值开头。这不是cin
的错。尝试:
if (cin >> a) {
cout << a endl;
}
在使用a
a
是否成功