繁体   English   中英

cin的未知行为

[英]Unknown behavior from cin

首先,我想说的是,我知道使用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中提取一个char并从本质上输出它。 然后我们继续循环。

我的看法是,最终cin.get()应该清除错误的输入; 但它永远不会做到:它陷入无限循环。 什么?

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

a)输入的值不适合变量

b)变量不会受到影响

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

接受输入整数后,按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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM