我正在尝试创建一个程序,该程序可以获取姓名和考试成绩,并将它们放入单独的向量中。我正在使用getline((,这样我就可以同时获得名字和姓氏。然而,每当我使用下面的代码时,第一个后面的每个名字都会丢失第一个字母。因此,如果姓名的输入是John Smith、Jane Smith、Jacob Smith等。程序输出John Smith、ane Smith、acob Smith,。。。我试着去掉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();
}...
问题:缺少字符
看到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');
}