刷新 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遍。当我输入随机数然后不使用空格(23
、45
、66
)接受它时,它可以正常工作。但是,当我的输入看起来像这样 23 45 66
(中间有空格)时,它会立即将 23
置于 a
、45
置于 b
和 66
至 c
。
我的意图是读取数字,以空格结束,然后忘记输入的其余部分并再次读取到下一个变量。
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
)
#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遍。当我输入随机数然后不使用空格(23
、45
、66
)接受它时,它可以正常工作。但是,当我的输入看起来像这样 23 45 66
(中间有空格)时,它会立即将 23
置于 a
、45
置于 b
和 66
至 c
。
我的意图是读取数字,以空格结束,然后忘记输入的其余部分并再次读取到下一个变量。
cin.ignore()
和 cin.clear()
似乎对我没有帮助,但可能我用错了。
我可以创建自己的缓冲区,然后检查它是否有空格,但在此之前我想看看是否有其他方法。
mikedu95 在评论中回答:
Read a whole line with
getline
, then perform string to integer conversion usingstoi
#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
)