我正在编写一个程序来接受用户输入并将其写入一系列并行数组。我已经编写了代码并编译并完成了所需的操作,但我一直在做一些错误修正,并意识到我的一些输出很不稳定。
我的意见是:
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
然而,在我的循环的第二次迭代中,一切都按预期工作。
答案 0 :(得分:3)
当你这样做时
cin >> grade[loopnum];
输入结尾处的换行符保留在输入缓冲区中。因此,当您调用getline
时,下一次迭代会将换行符作为空行,并且与输入的其余部分不同步。
基本上有两种解决方案:
getline
将整行读入字符串,然后使用其他方式获取整数(例如std::stoi
)