在这里,有两个cins,根据我的理解,每一个都离开' \ n'在缓冲区中,因为它们跳过空格。
Cin.ignore默认只跳过一个字符,因此其中一个字符是' \ n'被取出但是,还有一个' \ n'在缓冲区中,所以我希望getline可以看到' \ n'和getline跳过。
但是,当我运行此代码时,我可以输入string3。我哪里错了?
#include <iostream>
#include <string>
using namespace std;
int main()
{
string string1, string2, string3;
cout << "String1: ";
cin >> string1;
cout << "String2: ";
cin >> string2;
cin.ignore();
cout << "String3: ";
getline(cin, string3);
return 0;
}
答案 0 :(得分:0)
cin >> string2
查找下一个单词的开头,并跳过cin >> string1
之后留在缓冲区中的换行符。所以此时,只有第二个换行符仍在缓冲区中,cin.ignore()
跳过它。
更详细,如果您输入:
line1
line2
line3
缓冲区包含:
line1\nline2\nline3\n
^
^
显示缓冲区中的当前位置。一开始,它位于缓冲区的开头。执行cin >> string1
后,它看起来像:
line1\nline2\nline3\n
^
当你执行cin >> string2
时,它会找到下一个单词的开头(下一个l
字符),在完成后,缓冲区看起来像:
line1\nline2\nline3\n
^
然后cin.ignore()
跳过下一个换行符,如下所示:
line1\nline2\nline3\n
^
现在,当您致电getline()
时,它会使用line3
读取该行。