使用 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
时,下一次迭代会将换行符作为空行,并且与输入的其余部分不同步。
基本上有两种解决方法:
- 使用
getline
将整行读入字符串,然后使用其他方式获取整数(例如 std::stoi
)
- 像现在一样读出数字,然后 ignore the rest until a newline
我正在编写一个程序来获取用户输入并将其写入一系列并行数组。我已经编写了代码,它可以编译并执行所需的操作,但我一直在进行一些错误修复,并意识到我的某些输出是不稳定的。
我的输入是:
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
时,下一次迭代会将换行符作为空行,并且与输入的其余部分不同步。
基本上有两种解决方法:
- 使用
getline
将整行读入字符串,然后使用其他方式获取整数(例如std::stoi
) - 像现在一样读出数字,然后 ignore the rest until a newline