C++中getline函数读取缓冲区中回车以及cin结束符的问题
运行代码
#include<bits/stdc++.h>
using namespace std;
int main(){
string str;
int x;
cin>>x;
getchar();
while(x--){
getline(cin,str);
cout<<str<<endl;
}
return 0;
}
测试样例1
2
asd
asd
// 样例1先输入2, 回车, 输入asd,回车
测试样例2
2 haha
haha
asd
asd
// 样例2先输入2 haha, 回车,输入asd,回车
运行过程分析:
首先cin结束符是空格, 制表符,回车。getline默认结束符是回车。
缓冲区是输入数据的一个内存区。
接下来就可以分析这两个测试例子了。
首先,对于测试样例1,
输入2,回车。 这个时候这两个字符都在缓冲区中, cin从2开始读,读到回车键
结束。注意,这里结束符依然在缓冲区。缓冲区已经有回车,getline此时不可以
接受输入,所以只需print语句,打印到终端。所以少了一次,后面接受输入asd\n。
正常输出。
样例2同理。
从中我们可以看到cin和getline的区别
getline的结束符,结束后,没有放到缓冲区中。
而cin的结束符,结束后,在缓冲区中。
解决方法
在循环前加入getline(cin,str)。 为什么不加getchar(), 因为你不知道整数
后面多少空格,换行符,如果整数后面还有很多空格,一个getchar()是不行的。
从下面这个例子可以看到getchar没法解决多个空格,第二getline要想发挥作用
,缓冲区中必须无结束符,否则就调到print语句。
2 dfhkf jkd jhfhk kjf
dfhkf jkd jhfhk kjf
fjk
fjk