今天我写了一个关于vector和pair的简单c ++代码。代码如下:
void printInfo(vector< pair<string, int> >& pair_vec)
{
cout << "----- Authors' information: ------" << endl;
vector< pair<string, int> >::const_iterator iter = pair_vec.begin();
while (iter != pair_vec.end()) {
cout << iter->first << " " << (*iter).second << endl;
++iter;
}
cout << "------ end ------" << endl;
}
void getInfo1th(vector< pair<string, int> >& pair_vec)
{
pair_vec.clear();
cout << "Enter author's information(name and age):" << endl;
string name;
int age;
pair<string, int> next_auth;
while (cin >> name >> age) {
next_auth = make_pair(name, age);
pair_vec.push_back(next_auth);
}
cin.ignore(1000, '\n');
cin.clear();
}
void getInfo2nd(vector< pair<string, int> >& pair_vec)
{
pair_vec.clear();
cout << "Enter author's information(name and age):" << endl;
pair<string, int> next_auth;
while (cin >> next_auth.first >> next_auth.second) {
pair_vec.push_back(next_auth);
}
cin.ignore(1000, '\n');
cin.clear();
}
void getInfo3rd(vector< pair<string, int> >& pair_vec)
{
pair_vec.clear();
cout << "Enter author's information(name and age):" << endl;
string name;
int age;
pair<string, int> next_auth;
while (cin >> name >> age) {
next_auth = pair<string, int>(name, age);
pair_vec.push_back(next_auth);
}
cin.ignore(1000, '\n');
cin.clear();
}
int main(void)
{
vector< pair<string, int> > pair_vec;
getInfo1th(pair_vec);
printInfo(pair_vec);
getInfo2nd(pair_vec);
printInfo(pair_vec);
getInfo3rd(pair_vec);
printInfo(pair_vec);
return 0;
}
当我运行它时,按以下方式测试:
输入作者的信息(姓名和年龄):
输入作者的信息(姓名和年龄):
输入作者的信息(姓名和年龄):
第二种方法效果不佳。我也单独测试它,但它有效。我想,错误可能与向量的函数清楚有关。我试图使用擦除,它像以前一样工作。
答案 0 :(得分:1)
std::cin
存在问题并清除其错误标记。如果设置了错误标志,则std::cin
上无法继续执行其他操作。您需要先清除错误标志。变化:
cin.ignore(1000, '\n');
cin.clear();
为:
cin.clear();
cin.ignore(1000, '\n');
它应该没问题。
解释原因
在这一行:
while (cin >> name >> age)
您从STDIN
读取,直到发生错误。如果发生错误,则设置错误标志,并且将来尝试获取输入将失败。在重置错误状态之前,std::cin
上无法继续执行其他操作。这就是你打电话的原因
cin.clear();
摆脱错误标志。现在进行是有道理的。您注意到输入失败(在getInfo1th()
中)因为您想要阅读的内容(它在您输入的 df 中)粘贴)。当您尝试再次输入(在getInfo2nd()
中)时,它将读取缓冲区中的相同输入(即 df ),它将再次失败。这就是为什么你想通过执行这个来跳转到下一行:
cin.ignore(1000, `\n`);