cin.ignore 如何与 cin 和 getline 一起工作?
How does cin.ignore work with cin and getline?
这里有两个 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;
}
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
的行。
这里有两个 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;
}
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
的行。