正确的方式来冲洗cin输入

时间:2016-01-13 18:50:00

标签: c++ input whitespace cin getline

#include <iostream>
using namespace std;

int a, b, c, d;

void main()
{
    cout << "Reading a" << endl;
    cin.ignore();
//  cin.clear();
    cin >> a;

    cout << "Reading b" << endl;
    cin.ignore();
//  cin.clear();
    cin >> b;

    cout << "Reading c" << endl;
    cin.ignore();
//  cin.clear();
    cin >> c;

    cout << a << " " << b << " " << c << endl;
    system("pause");
}

我从a到c读了3次变量。当我输入随机数时它很好用,然后不使用空格(234566)接受它。但是,当我的输入看起来像23 45 66(中间的空格)时,会立即将23添加到a,将45添加到b66c

我的目的是读取数字,以空格结束,然后忘记输入的其余部分,再次读取下一个变量。

cin.ignore()cin.clear()似乎没有帮助我,但可能我错误地使用了它们。

我可以创建自己的缓冲区然后检查它是否有空格,但在此之前我想看看是否还有其他方法。

2 个答案:

答案 0 :(得分:4)

mikedu95在评论中回答:

  

使用getline读取整行,然后使用stoi执行字符串到整数转换

#include <string>
#include <iostream>
using namespace std;

string str;
int a, b, c, d;

void main()
{
    cout << "Reading a" << endl;
    getline(cin, str);
    a = stoi(str);

    cout << "Reading b" << endl;
    getline(cin, str);
    b = stoi(str);

    cout << "Reading c" << endl;
    getline(cin, str);
    c = stoi(str);

    cout << a << " " << b << " " << c << endl;
    system("pause");
}

答案 1 :(得分:3)

你可以在这里找到答案: How does cin.clear() clear the input buffer?

我从这个页面带来了部分答案:

如果需要从输入缓冲区中删除字符,则需要明确地执行此操作。例如,您可以使用

  • stream.ignore();无条件删除下一个字符(如果有的话;如果没有,则流将设置std::ios_base::eofbit。)
  • stream.ignore(std::numeric_limits<std::streamsize>::max(), '\n');删除所有字符,包括遇到的第一个'\n'字符。
  • 您可能需要ignore()个字符而stream.peek()会产生您不喜欢的字符类(例如isdigit(stream.peek())会产生false