2012-09-13 51 views
8
#include<iostream>; 

int main() 
{ 
    int a = 1; 
    int b = 2; 
    std::cin >> a >> b; 
    std::cout << a << "+" << b << "=" << a+b << std::endl; 
    return 0; 
} 

当我输入3 4作为输入时,输出将是3+4=7,好吧,这很奇怪; 但是当我输入a b时,输出是0+0=0(为什么它是0和0?); 最容易混淆的是,a 4,它会是0+0=0(为什么不是'0 + 4 = 4'?????); 然后我写另一个编。cin做什么时出现错误

#include<iostream>; 

int main() 
{ 
    int a = 1; 
    int b = 2; 
    std::cin >> a; 
    std::cin.clear(); 
    std::cin >> b; 
    std::cout << a << "+" << b << "=" << a+b << std::endl; 
    return 0; 
} 

当我进入a 4,为什么它仍然0+0=0?是不是应该0+4=4

感谢所有热心的!

我写了prog3,来测试当我不写int a=1;int b=2时会发生什么;

2 

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a,b; 
    cin >> a ; 
    cin >> b; 
    cout<< a << "+"<< b <<"="<< a+b << endl; 
    return 0; 
} 

a b再次,它输出0+-1218170892=-1218170892(为什么不是0+0=0 ??)

+0

输入的值预计是一个整数,而不是一个字符。输入“a”,“3.141”或“whatever”无效。如果你的输入是“a”,那么程序不会知道你已经使用“a”作为变量,而是想使用默认值。 – stefan

+0

很明显,它是C++ 11,因为否则,值将是1和2,而不是0。 – Drise

+0

要回答您的编辑:您尚未从输入中删除a。你需要'cin.clear(); cin.ignore(1);',这样第二次提取就会成功。 – Drise

回答

1

像所有istreamsstd::cin有错误位。这些位在发生错误时设置。例如,您可以找到具有good(),bad(),eof()等功能的错误位的值。如果读取错误的输入(fail()返回true),请使用clear()清除标志。你也可能需要一个ignore(1);来删除冒犯的角色。

查看State functions节以获取更多信息。 http://en.cppreference.com/w/cpp/io/basic_ios

+0

Thanks.But我是sill想知道为什么a和b的值都变成了0 – user1668903

+0

如果你读错了输入,'bad()'仍然会返回false;它是'fail()',它将返回true。而你所引用的页面误导性地被简化了,而对于'good()'来说简直是错误的(即使没有发生错误也可以返回false)。扔掉它,找到更好的东西。 –

+0

您似乎在使用C++ 11:*如果提取失败,则将零写入值并设置失败位。 **(自C++ 11以来)***。 – Drise

0

std :: cin是一个istream实例,因此它在读取某些无效时保持其错误状态。

为了“治愈”它,你都必须清除其标志

std::cin.clear(); 

,并刷新其缓冲区。

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

更令人惊讶的是,它虽然不会返回1 + 2 = 3,当您输入无效字符,如我期望一个失败的CIN流有什么它试图更新没有副作用。

+1

OP正在使用C++ 11:*如果提取失败,则将零写入值并设置失败位。 **(自C++ 11以来)*** – Drise

+0

这只是整数情况,还是用户类型的一般规则:如果流入失败,对象应该恢复到默认状态?我一直认为流入对象是有缺陷的逻辑。工厂创建的对象具有从流中读取的数据,对象不会流式传输到对象中。 – CashCow

+0

“*流入对象是有缺陷的逻辑。工厂创建的对象具有从流中读取的数据,对象不会流入*” - 与'operator <<'必然是预先存在的对象(给定by-reference参数),尽管创建一个新对象的工厂通常是可取的,但有些时候它不会(例如,当你想要缓冲区和对象已经重新用于下一个值的其他资源)以及“工厂”如何在堆栈上创建对象(除非对象是运行时多态的,需要延长的生命周期等,否则非常可取)。 –

0

根据C++ 11的错误,该值设置为零:如果提取失败,则写入零值并设置失败位。

在“4”例如,两个值都为0,因为缓冲器尚未冲洗/清除,因此第二读CIN仍然读取错误,并且还接收0