使用 getline() 后出错 space

Erroneous space after using getline()

我正在编写一个程序来获取用户输入并将其写入一系列并行数组。我已经编写了代码,它可以编译并执行所需的操作,但我一直在进行一些错误修复,并意识到我的某些输出是不稳定的。

我的输入是:

ABC 123
Fall 2015
ABC 123

BAC 213
Fall 2015
BAC 213

CAB 321
Fall 2015
CAB 321

然而,我得到的结果是:

ABC 123
Fall 2015
ABC 123


BAC 213
Fall 2015

CAB 321
Fall 2015
CAB 321

我想我已经将问题代码隔离到以下部分:

for ( ; loopnum < clnum; loopnum++) {
                cout << "What was the name of the class?:\n";
                cin.ignore();
                getline(cin, clnam[loopnum]);

                cout << "What about the semester?:\n";
                getline(cin, crsem[loopnum]);

                cout << "Now the course number:\n";
                getline(cin, crnum[loopnum]);

                cout << "And the grade you received:\n";
                cin >> grade[loopnum];

我想我在这里的某个地方读到过,使用 getline() 会导致输入后出现错误的空格,这似乎就是正在发生的事情。知道如何解决这个问题吗?

编辑:

其实我自己解决了这个问题。我遇到的问题与我认为负责的代码段完全无关。相反,我一直在使用:

getline(infile, clnam[readplace]);
getline(infile, crsem[readplace]);
getline(infile, crnum[readplace]);

在一个单独的函数中,设计用于将数组数据写入文件。将它们改为:

infile >> clnam[readplace];
infile >> crsem[readplace];
infile >> crnum[readplace];

问题已解决。我不确定为什么会这样。该函数甚至没有在 for 循环内调用。

然而,这暴露了一个新问题。在我的循环的第一次迭代中,getline 调用似乎被视为 cin。我的意思是,输入:

ABC 123
Fall 2015
ABC 123

结果:

ABC
123
Fall

然而,在我的循环的第二次迭代和以后的迭代中,一切都按预期进行。

当你做的时候

cin >> grade[loopnum];

输入末尾的换行符留在输入缓冲区中。因此,当您调用 getline 时,下一次迭代会将换行符作为空行,并且与输入的其余部分不同步。

基本上有两种解决方法:

  1. 使用 getline 将整行读入字符串,然后使用其他方式获取整数(例如 std::stoi
  2. 像现在一样读出数字,然后 ignore the rest until a newline