该程序似乎忽略了第二个输入行

时间:2017-03-15 15:29:24

标签: c++

所以我一直在研究Bjarne Stroustrup的PPP书中的编程,并且有以下任务:

  1. 编写一个程序,首先输入一组名称和值对, 例如Joe 17和Barbara 22.对于每一对,将名称添加到矢量 称为名称和数字到一个称为分数的向量(相应的 位置,如果名称[7] ==“乔”,则得分[7] == 18)。终止 线路输入不再(“更多”将尝试读取另一个 整数失败)。检查每个名称是否唯一,并以错误终止 如果输入两次名称,则显示消息。写出所有(名称,分数)对, 每行一个。
  2. 修改练习19中的程序,以便在输入名称时 程序将输出相应的分数或“未找到名称”。
  3. 修改练习19中的程序,以便在输入整数时 该程序将输出具有该分数或“未找到分数”的所有名称。 所以这是我写的代码:

    using namespace std;
    
    int main() {
        vector <string> names;
        string name;
        vector <int> scores;
        int score;
        string finish = "no more";
        cout << "Please write a player's name and the player's score: \n";
        while (name != "|") {
            cin >> name;
            cin >> score;
            names.push_back(name);
            scores.push_back(score);
            cin.ignore();
        }       
        for (size_t j = 0; j < scores.size(); j++) {
        for (size_t p = 0; p < scores.size(); p++) {
            if (names[j] == names[p] && j != p) {
                cout << "Error! You have reiterated the name: " << names[j] << "\n";
                system("pause");
                return 1;
                }
            }
        }
        cout << "Please insert a name to see it's score:\n";
        string s = " ";
        cin >> s;
            for (size_t d = 0; d < scores.size(); d++) {
                if (s == names[d]) { 
                    cout << names[d] << "'s score is: " << scores[d] << "\n";
                }
        }
        system("pause");
    }
    
  4. 现在我的问题很简单,我相信。在第二个 cin(cin&gt;&gt; s)中,编译器似乎只是跳过这一行并终止程序而不是让我写一个输入。我在网上看到,这是因为你不能使用 cin 两次,所以当我添加行cin.ignore()时,希望问题能够解决,它无助于解决问题。有关如何解决此问题的任何提示?

2 个答案:

答案 0 :(得分:2)

我认为问题在于,当您使用cin >> score并输入不是整数的内容时,会设置cin流上的错误标记,并且将来的操作会失败。在阅读更多输入之前,您需要使用cin.clear()清除此错误。

您的学生姓名循环也是错误的。你永远不会检查“没有更多”的名字。你检查“|”作为名称,但直到您完成输入处理。正如说明所说,使用no more作为输入的目的是cin >> score失败,因为more不是数字。

相反,请使用while (cin >> name >> score)一次读取名称和分数。当您输入无效分数时,这将失败并且循环结束。

using namespace std;

int main() {
    vector <string> names;
    string name;
    vector <int> scores;
    int score;
    cout << "Please write a player's name and the player's score: \n";
    while (cin >> name >> score) {
        names.push_back(name);
        scores.push_back(score);
        cin.ignore();
    }       
    cin.clear(); // Clear error flag from above
    for (size_t j = 0; j < scores.size(); j++) {
        for (size_t p = 0; p < scores.size(); p++) {
            if (names[j] == names[p] && j != p) {
                cout << "Error! You have reiterated the name: " << names[j] << "\n";
                system("pause");
                return 1;
            }
        }
    }
    cout << "Please insert a name to see it's score:\n";
    cin >> s;
    for (size_t d = 0; d < scores.size(); d++) {
        if (s == names[d]) { 
            cout << names[d] << "'s score is: " << scores[d] << "\n";
        }
    }
    system("pause");
}

答案 1 :(得分:-1)

这里发生的是,当你按下输入字符&#39; \ n&#39;还在流中。所以你需要冲洗cin以便能够再次继续。为此,请使用

std::cin.clear();
std::cin.ignore(numeric_limits<streamsize>::max(), '\n');
每次打电话给cin之后。 numeric_limits<streamsize>::max可与标题#include <limits>

一起使用