C++学习笔记进阶:cin>> cin.getline() string库中的getline()

本文引用他人博客链接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到;而后者需要自己再给输入。

猜你喜欢

转载自blog.csdn.net/Wzz_Liu/article/details/82597335