在 for 循环中使用 getline() 后难以获得 double

Having difficulty obtaining double after using getline() in for loop

我正在尝试创建一个程序来获取姓名和测试分数并将它们放入单独的向量中。我正在使用 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()s,如果你不能完全避免它们,在你想要的垃圾消失的操作之后。如果您将 ignore() 放在另一个操作之前,您迟早会在流中没有垃圾的情况下执行该操作。在这种情况下,您会更快地击中它。

接下来,您想要 ignore() 包括换行符在内的所有内容。用户在我们想要的输入之后输入的任何内容都是垃圾,应该丢弃。否则 ignore() 取出一个 space 字符或其他同样无用的东西并留下换行符让 getline 跳过。我会把它留给老朋友 explain what you need to do

具体来说,使用

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'); 
    }