出现错误时,cin会做什么

时间:2012-09-13 14:41:21

标签: c++ error-handling cin

#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'?????); 然后我写了另一个编程。

#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 ??)

3 个答案:

答案 0 :(得分:1)

与所有istreams一样,std::cin有错误位。发生错误时设置这些位。例如,您可以使用good()bad()eof()等函数找到错误位的值。如果读取错误输入(fail()则返回{{1 }}),使用true清除标志。您还可能需要clear()来删除有问题的角色。

有关详细信息,请参阅ignore(1);部分。 http://en.cppreference.com/w/cpp/io/basic_ios

答案 1 :(得分:0)

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

为了“治愈”它,你必须清除它的旗帜

std::cin.clear();

并刷新其缓冲区。

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

更令人惊讶的是,当您输入无效字符时,它不会返回1 + 2 = 3,因为我预计失败的cin流对其尝试更新的内容没有任何副作用。

答案 2 :(得分:0)

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

在'a 4'示例中,两个值均为0,因为缓冲区未被刷新/清除,因此第二个cin读取仍在读取错误,并且还接收值0.