gpt4 book ai didi

C++ cin 或 vector clear 不能正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:04 25 4
gpt4 key购买 nike

今天我写了一个简单的c++代码,关于vector和pair。代码如下:

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;
}

当我运行它时,测试如下:

  1. 输入作者信息(姓名和年龄):

    • 关于 23
    • dsds 23
    • ds df
    • --- 作者信息: ------
      • 关于 23
      • dsds 23
    • ----- 结束 ------
  2. 输入作者信息(姓名和年龄):

    • fdf 23
    • ----作者信息:------
    • ----- 结束 ------
  3. 输入作者信息(姓名和年龄):

    • dsd 23
    • dfd 23
    • sds df
    • ---- 作者信息: ------
      • fdf 23
      • dsd 23
      • dfd 23
    • ----- 结束 ------

第二种方法效果不佳。我也单独测试过,但它有效。我想,这个错误可能与 vector 的清除功能有关。我尝试使用删除,它像以前一样工作。

最佳答案

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`);

关于C++ cin 或 vector clear 不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30598564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com