使用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. 像现在一样阅读数字,但在换行之前忽略其余部分

最新更新