来自cin的未知行为

Unknown behavior from cin

本文关键字:未知 cin 来自      更新时间:2023-10-16

首先我想说,我知道使用getline是一个更好的选择,但是,我很好奇为什么这段代码不像预期的那样工作:我不能弄清楚为什么

#include <iostream>
#include <string>
using namespace std;
int main() {
    while(1) {
        int input;
        cout << "---> ";
        cin >> input;
        if(cin.fail()) {
            char rd = cin.get();
            cout << "failure" << rd << "=" << cin.fail() << " " << endl;
        }
    }

    return 0;
}

预期:如果输入一个整数,继续,否则cin失败,我们从stdin中取出一个字符并输出它。然后继续循环。

在我看来,最终cin.get()应该会清除错误的输入;但它从来没有这样做过:它陷入了一个无限循环。怎么啦?

cin.fail()检测输入的值是否符合变量中定义的值。但是如果cin.fail()为真,则意味着

a)输入的值不适合变量

b)变量不受影响

c)流仍然中断

d)输入的值仍然在缓冲区中,并将用于下一个"cin>> variable"语句。

因此你必须这样做:

a)通过cin.clear()修复流;

b)用cin.ignore(std::numeric_limits::max(),'n');

   #include <iostream>
   #include <string>
     using namespace std;
     int main() {
     while(1) {
     int input;
     cout << "---> ";
     cin >> input;
     if(cin.fail()) {
        char rd = cin.get();
        cout << "failure" << rd << "=" << cin.fail() << " " << endl;
        cin.clear();
        cin.ignore();
        }
      }
    return 0;
    }

接受输入的整数后,按回车键时将得到一个换行符作为字符。与字符输入

相同
#include <iostream>
#include <string>
using namespace std;
int main() {
    while(1) {
        int input;
        cout << "---> ";
        cin >> input;
        getchar();
        if(cin.fail()) {
            char rd = cin.get();
            getchar();
            cout << "failure" << rd << "=" << cin.fail() << " " << endl;
        }
    }
    return 0;
}