我正在尝试创建一个程序,它获取名称和测试分数,并将它们放在单独的向量中。我使用getline(),这样我就可以同时获得名字和姓氏。但是,每当我使用下面的代码时,第一个后面的每个名称都会丢失它的第一个字母。因此,如果输入的名字是约翰史密斯,简史密斯,雅各布史密斯等。程序输出约翰史密斯,安史密斯,阿科布史密斯,……我试着取出cin.ignore(),但是程序在第一个条目之后一直运行。我还尝试创建单独的函数来获取姓名和分数,但这也不起作用。如果有任何建议或帮助,我们将不胜感激。
int main() {
string test_taker;
int num_of_students = 0;
cout << "How many students took the exam? ";
cin >> num_of_students;
int starting = 0;
vector <double> score_list_us(num_of_students);
vector <string> name_list_us(num_of_students);
vector<double> score_list_sorted(num_of_students);
vector<string> name_list_sorted(num_of_students);
for (int i =0; i < num_of_students; i++) {
cout << "Student #" << i + 1 << " Name: ";
cin.ignore();
getline(cin, name_list_us[i]);
cout << "Student #" << i + 1 << " Score: ";
cin >> score_list_us[i];
cin.ignore();
}...发布于 2020-04-14 00:49:51
问题:缺少角色
看到cin.ignore();就在getline(cin, name_list_us[i]);前面了吗?猜猜它能做什么。
在第一个循环中,cin.ignore();每隔一次通过循环吃掉cin >> num_of_students;留下的换行符,因此它会吃掉部分数据。
解决方案
如果您不能完全避免使用ignore(),请始终在操作结束后放进您想要的垃圾。如果将ignore()放在另一个操作之前,那么迟早会在流中没有垃圾的情况下执行该操作。在这种情况下,你打得更快。
接下来,您希望ignore()所有内容,直到并包括换行符。用户在输入后输入的任何内容都是垃圾,应该被丢弃。否则,ignore()会取出一个空格字符或同样无用的东西,留下换行符让getline跳过。我将把它留给解释你需要做什么的一个老朋友。
具体来说,使用
cin.ignore(numeric_limits<streamsize>::max(), '\n');所以
int main() {
string test_taker;
int num_of_students = 0;
cout << "How many students took the exam? ";
cin >> num_of_students;
// ignore after
cin.ignore(numeric_limits<streamsize>::max(), '\n');
int starting = 0;
vector <double> score_list_us(num_of_students);
vector <string> name_list_us(num_of_students);
vector<double> score_list_sorted(num_of_students);
vector<string> name_list_sorted(num_of_students);
for (int i =0; i < num_of_students; i++) {
cout << "Student #" << i + 1 << " Name: ";
// not before
getline(cin, name_list_us[i]);
cout << "Student #" << i + 1 << " Score: ";
cin >> score_list_us[i];
// because this guy eats the newlines
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}https://stackoverflow.com/questions/61198593
复制相似问题