刷新 cin 输入的正确方法

Proper way to flush cin input

#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 置于 a45 置于 b66c

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

cin.ignore()cin.clear() 似乎对我没有帮助,但可能我用错了。

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

mikedu95 在评论中回答:

Read a whole line with getline, then perform string to integer conversion using 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");
}

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

我把这个页面的部分答案带到这里:

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

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