cin 在出现错误时会做什么

What does cin do when there is an error

本文关键字:什么 错误 cin      更新时间:2023-10-16
#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??

像所有的istreams一样,std::cin也有错误位。这些位是在发生错误时设置的。例如,您可以使用 good()bad()eof() 等函数找到错误位的值。如果读取错误的输入(fail()返回true(,请使用clear()清除标志。您可能还需要一个ignore(1);来删除违规字符。

有关详细信息,请参阅State functions部分。 http://en.cppreference.com/w/cpp/io/basic_ios

根据 C++11 在出现错误时将值设置为零:如果提取失败,则向值写入零并设置故障位。

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

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

为了"治愈"它,您必须清除其标志

std::cin.clear();

并冲洗其缓冲区。

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

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