我的代码是这样的
while (true) {
getline(cin, name);
if (name == "quit")
break;
cin.clear(); // 重置 cin 输入状态
cin.sync(); // 清除 cin 缓冲区未读取信息
cin >> rate;
v.push_back(lesson(rate, name));
cin.clear(); // 重置 cin 输入状态
cin.sync(); // 清除 cin 缓冲区未读取信息
}
输入【Test input】是这样
hello world
4
dangerous
5
human
2
但是我的v却有了6个元素(其中夹着name为空的元素,他们的rate和前一个一模一样),正常来说是三个的才对啊。。。
怎么回事呢?
补充一下:就是在win的VS2013下输出结果正确,但在linux下的g++会有问题。
是不是你有回车等字符被加进到v里面了
那我也清空了
cin.clear(); // 重置 cin 输入状态
cin.sync(); // 清除 cin 缓冲区未读取信息
我帮你本地测试过了,这样没有问题,能输出3.
#include
#include
using namespace std;
struct lesson
{
string rate,name;
lesson(){}
lesson(string a,string b){
rate=a,name=b;
}
};
vector v;
int main()
{
string rate,name;
while (true) {
getline(cin, name);
if (name == "quit")
break;
cin.clear(); // 重置 cin 输入状态
cin.sync(); // 清除 cin 缓冲区未读取信息
cin >> rate;
v.push_back(lesson(rate, name));
cin.clear(); // 重置 cin 输入状态
cin.sync(); // 清除 cin 缓冲区未读取信息
}
cout<<v.size();
}
在输入name和rate之前加入提示符,并每次循环把rate重置,显示如下
>>>>(name)A
>>>>(rate)1
#name=A, rate=1
>>>>(name)>>>>(rate)B
#name=, rate=-1
>>>>(name)>>>>(rate)2
#name=B, rate=2
>>>>(name)>>>>(rate)C
#name=, rate=-1
>>>>(name)>>>>(rate)3
#name=C, rate=3
第二次循环的时候,name直接得到了空串,而输入的B又不是合法的数字,导致rate输入失败,进入下一轮循环;
上一轮残余的B,在第三轮循环中被赋予name。<< 注意它并没有被cin.csync给清掉。
第一次输入rate的时候,缓冲区里有两个字符'1\n',由于要求int类型,所以只有1个字符被读取,剩下的\n留在buffer里面。
再次调用getline的时候,直接返回空字符串。