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