在for循环中使用getline()后难以获得双精度

问题描述 投票:0回答:1

我正在尝试创建一个程序,以获取名称和测试分数,并将其放入单独的向量中。我正在使用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();
}...
c++ for-loop user-input cin getline
1个回答
1
投票

问题:缺少字符

[看到cin.ignore();就在getline(cin, name_list_us[i]);前面吗?猜猜它做什么。

在循环的第一遍中,cin.ignore();吃掉了cin >> num_of_students;留下的换行符。每隔两次,循环中就不会再吃换行符,因此它会占用部分数据。

解决方案

总是放ignore(),如果您不能完全避免使用它们,请在将您想要的垃圾丢掉之后进行操作。如果将ignore()放在其他操作之前,则迟早要执行该操作而不会在流中产生垃圾。在这种情况下,您会更快地点击它。

下一步,您想ignore()包括换行符的所有内容。用户在我们想要的输入之后键入的任何内容都是垃圾,应该丢弃。否则,ignore()会取出一个空格字符或同样无用的内容,并让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'); 
    }
© www.soinside.com 2019 - 2024. All rights reserved.