C++ 输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取。
cin >> 流提取运算符根据它后面的变量类型读取数据,从非空白符号开始,遇到Enter、Space、Tab键时结束。
getline函数从istream中读取一行数据,包括前导和嵌入的空格,当遇到“\n”时结束返回。
在使用getline读入一整行时,
若是前面是使用getchar()、cin这类读入数据,但是不会读入后续换行\n符号或者空格的输入时,再接getline()就容易出现问题。
这是因为cin输入敲回车后,产生的换行符仍然滞留在输入流中,接着就被getline(cin,s)给读取并结束返回,此时s = “\n” ,所以实际上s只是读入了一个换行符\n。
而若前面使用getline(),再用getline()进行读入,此时不会发生问题。
因为getline()中读入结束的回车后,结束符不放入缓存区,会将读入的\n直接删除,下一个输入前,缓冲区为空,并不会因为回车留下\n。
所以当 cin>> 后使用 getline() 时,我们需要将输入流中的换行符进行手动清除,即调用cin.ignore(); 函数。
- int main()
- {
- string str;
- int n, m;
- cin >> n >> m;
- cin.ignore();
- getline(cin,str);
-
- cout << n << m << endl;
- cout << str << endl;
-
- system("pause");
- return 0;
- }