C ++ cin或vector清楚不行

时间:2015-06-02 14:12:25

标签: c++ vector

今天我写了一个关于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;
}

当我运行它时,按以下方式测试:

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

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

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

    • dsd 23
    • dfd 23
    • sds df
    • ----作者信息:------
      • fdf 23
      • dsd 23
      • dfd 23
    • -----结束------
  4. 第二种方法效果不佳。我也单独测试它,但它有效。我想,错误可能与向量的函数清楚有关。我试图使用擦除,它像以前一样工作。

1 个答案:

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