#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()
似乎没有帮助我,但可能我错误地使用了它们。
我可以创建自己的缓冲区然后检查它是否有空格,但在此之前我想看看是否还有其他方法。
答案 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
)