本文引用他人博客链接po出来:
https://blog.csdn.net/a1015553840/article/details/50579396
https://www.cnblogs.com/hchacha/p/6517564.html
1.cin函数
cin>>a;
结束条件:[enter],[space],[tab]
处理方法:cin遇到缓冲区中的[enter],[space],[tab]会结束当前输入,并舍弃[enter],[space],[tab],继续下一项输入,当有连续[space],[enter,[tab]会全部舍弃。
char a[10],b[10];
cin>>a;cin>>b;
cout<<a<<endl<<b<<endl;
输入:1234[enter]5678[enter]
输出:1234 【此处换行】 5678
输入:1234[enter][enter[enter] ... [enter]5678[enter]
输出:1234 【此处换行】 5678 (说明不管缓冲区中有几个enter,cin都会无视,直到不是enter开始继续读入 tab,space同理。
实际是一个istream对象,cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。当cin>>从缓冲区中读取数据时,若缓冲区字符有[enter],[space],[tab]这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。
cin可以作为判别条件放在while或if中
使用一个istream的对象作为条件时,效果是检查流的状态。若流有效,则检测成功,返回true。若流状态变为false。即无效输入,就不再能输入了。
通过使用cin.clear()函数可以重设cin的状态为有效。
2.string中的getline
istream& getline (istream& is, string& str, char delim);
可见返回的是一个输入流,第一个参数也是一个输入流,第二个是将输入赋给str参数,第三个是终止符。
string中的getline无论多长,都可以赋给str,又因为getline函数返回的也是一个istream对象,又不存在由于空间原因赋值失败的可能,即流状态一直有效,true,所以放在while循环里,while(getline(cin,line))是一个死循环。
并且string中的getline不会忽略space tab这些分隔符,默认遇见Enter停止。所以Enter留在了缓冲区,等待下次输入进行换行。
而cin.getline(c,size)不同,当size太大,c字符数组装不下,返回false。
3.cin(istream类)中的成员函数get() getline()
除了get()的一参数形式,别的都是只以enter为一次输入,把space tab当成字符处理
get()
与cin不同,cin.get()在缓冲区遇到enter,space,tab不会作为舍弃,而是继续留在缓冲区中
1.一参数
对于单个的 int ,char 的get
int a;cin.get(a);
把enter,space,tab也当作字符处理。
2.两参数
istream& get(char*,int);
当get传入的是指针或是数组名时,一定要指定字符大小(及上面的int)。
当int值过大,
当:char a[10];cin,get(a,20);
输入:123456789012[enter]
系统自动扩充a[10],此时实际数组长为13('\0')。但当计算sizeof(a)时,仍为10。
当:char a[5];cin,get(a,10);
输入:123456789012[enter]
输出:123456789 先截取了9个字符变成‘123456789‘/0‘’,然后放入到a中,a自动扩张长度
当:char a[15],cin.get(a,10)
输入:123456789012[enter]
输出:123456789 此时数组内为‘123456789‘\0’’ 注意:前size-1有效,最后一个补‘\0’
3.三参数
istream& get(char *,int,char s)
char为自定义的终止符。遇到给定的char s,则当前输入结束,缓存区里的s将被舍弃
cin.getline()
只有二参数,三参数两类
和cin.get()非常类似,区别:
二参数
cin.get(arrayname,size)当遇到[enter]时会结束目前输入,它不会删除缓冲区中的[enter]
cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,但是会删除缓冲区中的[enter]
三参数
cin.getline(arrayname,size,s)当遇到s时会结束输入,并把s从缓冲区中删除
cin.get(arrayname,size,s)当遇到s时会结束输入,但不会删除缓冲区中的s
实例:
char a[10];char b;
cin.get(a,10);
cin.get(b);
cout<<a<<endl<<int(b);
char a[10];char b;
cin.getline(a,10);
cin.get(b);
cout<<a<<endl<<int(b);
两者,前面不需要再额外输入b,回车直接赋给b,因为是一参数的,可以get到;而后者需要自己再给输入。