来自cin的未知行为

时间:2015-09-26 04:50:28

标签: c++

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

com.google.android.gms.wearable.NodeApi

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

我看到它的方式,最终cin.get()应该清除错误的输入;但它永远不会:它陷入了一个infintie循环。什么?

2 个答案:

答案 0 :(得分:3)

cin.fail()检测输入的值是否适合变量中定义的值。 但如果cin.fail()为true,则表示

a)输入的值不适合变量

b)varialbe不会受到影响

c)井流仍然破裂

d)输入的值仍在缓冲区中,并将用于下一个" cin>>变量"声明

因此您必须执行以下操作:

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;
    }

答案 1 :(得分:0)

获取输入整数后,按Enter键时会将换行符作为字符。与字符输入相同

#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;
}