测试了一下cin,cin.get(),cin.getline(),在这里把理解的记一下:
cin
最常用的输入,
读入结束条件:遇到Space 、Tab、 Enter
对结束符的处理 :忽略但并不会丢弃缓冲区中使得输入结束的结束符(Enter、Space、Tab)例如:
int a,b;
cin>>a>>b;
cout<<a<<endl;
cout<<b<<endl;
输入:1(空格)2(回车)
输出:1
2
cin并不会丢弃缓冲区中使得输入结束的结束符
#include<iostream>
#include<string>
using namespace std;
int main(){
int a;
string str;
cin>>a;
getline(cin,str);
cout<<a<<endl;
cout<<str<<endl;
return 0;
}
输入2Enter
输出2
第二行是输出了str,我们并看不见,这是因为cin读入了2并赋值给了a,但是并没有将Enter丢弃,Enter依然在缓冲区中,所以getline遇到Enter就认为结束了,所以,读取了一个空字符串赋值给了str,所以输出str只是输出了一个空字符串。
当第一次输入非法时,比如输入:a(空格)2(回车)
输出为:2130567168
4246608
我也不知道上面的输出是什么,总之,输入非法时会出错;
cin.get()
1、可以读取单个字符,比如:
char ch;
cin.get(ch);//等同于ch=cin.get();
可以输入一个字符赋值给ch;
2、可以读取整行输入,包括Space和Tab键,
输入结束条件:遇到Enter键
对结束符的处理:不处理
比如
char ch[5];
cin.get(ch,5,'a');
cout<<ch<<endl;
输入一行字符串(可包含Space键和Tab键)以Enter键结束,程序将截取前4个字符或字符‘a’之前的字符赋值给ch数组,ch[4]或其他数组元素将自动赋值为'\0';
char a,b;
cin.get(a);
cin.get(b);
cout<<a<<endl;
cout<<(int)b<<endl;
输入:a(回车)
输出:a
10//回车键的ASCII码,表明结束符依然存在缓冲区中
cin.getline()
cin.getline() 与 cin.get(array_name, Arsize)的读取方式差不多,以Enter结束,可以接受Space和Tab字符。按照长度(Arsize)读取字符, 会丢弃最后的Enter字符,但是如果输入长度超过array_name,就会认为是个非法的操作,程序会把cin流阻断, 就是在iostream 标志条上的 fail位设置为1,这样流就不能用了,所以你后面用的cin的语句无效。通过使用cin的成员函数 cin.clear() 可以清除fail位上的1为0,这样又可以使用cin流了。