使用getline后的错误空间()

时间:2015-12-10 11:34:01

标签: c++ arrays 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

然而,在我的循环的第二次迭代中,一切都按预期工作。

1 个答案:

答案 0 :(得分:3)

当你这样做时

cin >> grade[loopnum];

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

基本上有两种解决方案:

  1. 使用getline将整行读入字符串,然后使用其他方式获取整数(例如std::stoi
  2. 按现在的方式阅读该号码,然后ignore the rest until a newline