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

C++ 程序似乎忽略了第二个输入行,c++,C++,因此,我一直在学习Bjarne Stroustrup的《PPP》一书中的编程,有以下任务: 编写一个程序,首先输入一组名称和值对, 比如乔17岁和芭芭拉22岁。对于每对,将名称添加到向量 被调用的名字和数字对应到一个称为分数的向量中 位置,因此如果名称[7]==Joe,则得分为[7]==18。终止 通过“不再”行输入将尝试读取另一行 整数失败。检查每个名称是否唯一,并以错误结束 如果输入两次名称,则返回消息。写出所有的名字,分数对, 每行一个。 修改练习19中的程序,以便在输入名称时, 程序将输

因此,我一直在学习Bjarne Stroustrup的《PPP》一书中的编程,有以下任务:

编写一个程序,首先输入一组名称和值对, 比如乔17岁和芭芭拉22岁。对于每对,将名称添加到向量 被调用的名字和数字对应到一个称为分数的向量中 位置,因此如果名称[7]==Joe,则得分为[7]==18。终止 通过“不再”行输入将尝试读取另一行 整数失败。检查每个名称是否唯一,并以错误结束 如果输入两次名称,则返回消息。写出所有的名字,分数对, 每行一个。 修改练习19中的程序,以便在输入名称时, 程序将输出未找到的相应分数或名称。 修改练习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");
}

我想我的问题很简单。在第二个示例中,编译器似乎只是跳过这一行并终止程序,而不是让我编写输入。我在网上读到,这是因为你不能使用cin两次,所以当我添加cin.ignore这行时,希望问题会得到解决,但这无助于解决问题。有关如何解决此问题的任何提示?

这里发生的是,当您按enter键时,字符“\n”仍在流中。因此,您需要刷新cin才能再次继续。为此,请使用

std::cin.clear();
std::cin.ignore(numeric_limits<streamsize>::max(), '\n');

每次打电话给cin后。数值限制::max可用于标题include

我认为问题在于,当您使用cin>>评分并输入非整数的内容时,cin流上的错误标志被设置,未来的操作失败。在读取更多输入之前,需要使用cin.clear清除此错误

学生姓名的循环也是错误的。你从来没有检查过“不再有名字”。您将检查|作为名称,但直到您完成输入处理。正如说明所述,使用no more作为输入的目的是为了使cin>>得分失败,因为more不是一个数字

相反,使用while>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");
}

不是编译器忽略了行,而是程序忽略了行。因此,标题具有误导性。@riodoro1注意到并修复了:你的名字中有空格吗?它没有跳过这一行。试着把cout@Barmar放进去,它只是跳过它,它不会让我在它真正应该输入的时候输入任何内容..操作符>>忽略被认为是空白的地方。谢谢,我不知道。为什么代码要处理我当时提供的代码段?好吧,现在在添加这些行之后,当我告诉它时,它根本不会执行任何东西。它只是\n而不是执行代码。cin.ignore的默认参数不是与您提供的参数相同吗?最可能的问题是其中一个名称中有空格。这将导致cin>>评分失败,因为缓冲区中仍有文本。这反过来意味着对cin的任何其他调用都将失败,直到清除缓冲区和错误标志。