缓冲区 cin() getline() getchar()
程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入
一. cin>>
该操作符是根据后面变量的类型读取数据。
输入结束条件 :遇到Enter、Space、Tab键。
对结束符的处理 :将\n类似的结束符落在缓冲区里.
所以会有如下的程序和结果:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1,s2;
cin>>s1;
getline(cin,s2);
cout<<s1<<endl;
cout<<s2<<endl;
return 0;
}
只输入了一行abc, 然后回车后就输出一行abc, 一行空
这是因为cin在缓冲区里丢下的\n 给后面的getline()当成输入结束的标志了
二.getline(cin, str)
输入结束条件:Enter键
对结束符处理:将\n结束符从缓冲区里清除.
所以会有如下的程序
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
cout<<s1<<endl;
cout<<s2<<endl;
return 0;
}
如果在输入完abc后, 按两次回车, 就会有如下结果
三.getchar()
清除缓冲区里的\n , 建议用getchar(), 这种方式最方便.
四. 例子
先输入一个整数到变量n里 ,然后读入n行字符串, 注意用getchar()消除\n
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
string s1;
cin>>n;
getchar();
while(n--){
getline(cin, s1);
}
//process these strings
return 0;
}