getline输入问题,求大神解答!!!!

我的代码是这样的
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++会有问题。

6个回答

是不是你有回车等字符被加进到v里面了

lck32578
lck32578 但我的cin.sync(); 已经清空
4 年多之前 回复

那我也清空了
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();
}

lck32578
lck32578 谢谢您
4 年多之前 回复
lck32578
lck32578 是的,但是我的作业网站是在linux下的,然后就有问题了...
4 年多之前 回复

在输入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给清掉。

lck32578
lck32578 然后元素个数会double
4 年多之前 回复
lck32578
lck32578 谢谢您!但还是有疑问就是,我的代码在linux下g++的作业网给出的结果碰巧是每一个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=2 >>>>(name)>>>>(rate)3 #name=C, rate=3
4 年多之前 回复
lck32578
lck32578 谢谢您!但还是有疑问就是,我的代码在linux下g++的作业网给出的结果碰巧是每一个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=2 >>>>(name)>>>>(rate)3 #name=C, rate=3
4 年多之前 回复

第一次输入rate的时候,缓冲区里有两个字符'1\n',由于要求int类型,所以只有1个字符被读取,剩下的\n留在buffer里面。
再次调用getline的时候,直接返回空字符串。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!