C++输入cin,cin.get(),cin.getline()详细比较及例子

来源:互联网 发布:淘宝网蔬菜种子 编辑:程序博客网 时间:2024/06/05 02:48

       C++输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取。cin,cin,get(),cin.getline()三个函数虽然都能进行数据读取,但是它们对缓冲区内数据的处理方法是不同的(如遇到[space],[enter]的处理方法)。本文将简单介绍cin,cin.get(),cin.getline()的基本用法,从根本上解释它们对缓冲区数据的处理方法。


1.cin的基本用法

    结束条件:[enter],[space],[tab]

    处理方法:cin遇到缓冲区中的[enter],[space],[tab]会结束当前输入,并舍弃[enter],[space],[tab],继续下一项输入,当有连续[space],[enter,[tab]会全部舍弃。

程序1:

#include<iostream>using namespace std;int main(){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同理

综上:cin的输入很简单,整体的看输入,遇到[enter],[space],[tab]表示当前输入结束,下一个输入从非[enter],[sapce],[tab]开始,两输入间无线多个[space][]enter[tab]都是无效的


2.cin.get()基本用法

(1)一参数

用法:a = cin.get()  或者  cin.get(a)

结束条件:输入字符足够后回车

说明:这个是单字符的输入,用途是输入一个字符,把它的ASCALL码存入到a中

处理方法:与cin不同,cin.get()在缓冲区遇到[enter],[space],[tab]不会作为舍弃,而是继续留在缓冲区中

程序2:

#include<iostream>using namespace std;int main(){char a,b,c,d;a = cin.get();b = cin.get();c = cin.get();d = cin.get();cout<<int(a)<<','<<int(b)<<','<<int(c)<<','<<int(d)<<endl;}
输入:[enter]  输出:不会结束,因为需要输入4个字符才结束(结束需要字符数够后回车)

输入:[enter][enter][enter][enter]      输出:10,10,10,10  

输入:abcdef[enter]     输出:97,98,99,100   字符太多时取前几个

输入:[tab][enter][space]a[enter]     输出:9,10,32,97(分别为[tab],[enter],[space],a的ASCALL码)不舍弃[enter],[tab],[space],统一看成字符

综上,一参数的cin.get()当输入字符足够后回车结束输入,把回车[enter],空格[space]也看成字符,在缓冲区中遇到不舍弃。当输入过多时,取前几个。

(2)二参数

用法:cin.get(arrayname,size)  把字符输入到arrayname中,长度不超过size

注释:arrayname必须是char[]类型,即char数组类型,不可以为string类型;size是指输入长度,即允许输入的最大长度。

处理方法:假设把数据输入到 char a[arraylength],数组长度为arraylength。cin.get(a,size)---size,arraylength不同可以分为四类:

类1:输入串长<size,输入串长>arraylength,会自动扩张arrayname大小,使能保存所有数据

例1:char a[10];cin,get(a,20);

输入:123456789012[enter]

输出a数组:123456789012 可以发现,输入12个字符到a[10]中,系统自动扩充a[10],此时实际数组长为13(‘123456789012'\0'’)。但当计算sizeof(a)时,还是现实为10

类2:输入串长<size,输入串长<arraylength,把串全部输入,后面补‘\0’

例2:char a[10];cin.get(a,20);

输入:12345[enter] 

输出:12345,此时数组内数据为‘12345‘\0’’

类3:输入串长>size,先截取size个字符,若还是大于arraylength,则输入前arraylength-1个字符,最后补充‘\0’

例3:char a[5];cin,get(a,10);

输入:123456789012[enter]

输出:123456789   先截取了9个字符变成‘123456789‘/0‘’,然后放入到a中,a自动扩张长度

类4:输入串长>size,先截取size个字符,若小于arraylength,则把截取串放入数组中,最后补充‘\0’

例4:char a[15],cin.get(a,10)

输入:123456789012[enter]

输出:123456789   此时数组内为‘123456789‘\0’’   注意:前size-1有效,最后一个补‘\0’

综上:当吧大于数组长度的字符串放出char a[arraylength]中,系统自动扩张数组a的长度使a能放得下,但是这么做容易产生运行错误

(3)三参数

用法:cin.get(arrayname,size,s)  把数据输入到arrayname字符数组中,当到达长度size时结束或者遇到字符s时结束

注释:a必须是字符数组,即char a[]l类型,不可为string类型;size为最大的输入长度;s为控制,遇到s则当前输入结束缓存区里的s将被舍弃

程序3:

#include<iostream>using namespace std;int main(){int i;char a[10];cin.get(a,10,'.');cout<<a;}
输入:abc.123

输出:abc    遇到  ’.‘ 输入结束


3.cin.getline()基本用法

cin.getline()的用法和cin.get()用法大致相同,没有一参数用法,只有二参数,三参数两类

cin.gerline(arrayname,size)

cin.getline(arrayname,size,s)用法与cin.get()效果大致相同,但也有些区别

(1)cin.getline(arrayname,size)与cin.get(arrayname,size)的区别

cin.get(arrayname,size)当遇到[enter]时会结束目前输入,他不会删除缓冲区中的[enter]

cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,但是会删除缓冲区中的[enter]

#include<iostream>using namespace std;int main(){char a[10];char b;        cin.get(a,10);cin.get(b);cout<<a<<endl<<int(b);}
输入:12345[enter]

输出:12345 【换行】 10

说明:cin.get(a,10)把12345到a中,遇到[enter]结束,但是不把[enter]删除,则把[enter]输入到b中,(enter的ASCALL码为10)

#include<iostream>using namespace std;int main(){char a[10];char b;        cin.getline(a,10);cin.get(b);cout<<a<<endl<<int(b);}
输入:12345[enter]a[enter]

输出:12345【换行】97

说明:cin.getline(a,10)吧12345输入到a中,遇到{enter}结束,并把缓冲区中[enter]删除,把接下来的a输入到b中
(2)cin.getline(arrayname,size,s)与cin.gei(arrayname,size,s)的区别

cin.getline(arrayname,size,s)当遇到s时会结束输入,并把s从缓冲区中删除

cin.get(arrayname,size,s)当遇到s时会结束输入,但不会删除缓冲区中的s

#include<iostream>using namespace std;int main(){char a[10];char b;    cin.get(a,10,',');cin.get(b);cout<<a<<endl<<b;}
输入:12345,[enter]

输出:12345【换行】,

说明:cin,get不会删除缓冲区的,

#include<iostream>using namespace std;int main(){char a[10];char b;    cin.getline(a,10,',');cin.get(b);cout<<a<<endl<<int(b);}

输入:12345,[enter]

输出:12345【换行】10

说明:cin.getline吧12345输入到a中,遇到’,‘结束,并删除缓冲区的’,‘,后面的[enter]输入到b中


4.运用---以任何符号作为输入分隔符

例题:输入五个学生的名字,每个学生的名字不超过10个字符,输入时学生名字之间用逗号隔开,把这五个名字存储并换行输出

#include<iostream>using namespace std;int main(){char a[5][10];int i;for(i=0;i<4;i++)cin.getline(a[i],10,',');cin.getline(a[i],10);for(i=0;i<5;i++)cout<<a[i]<<endl;}


这样我们就可以完成完成用任何符号作为分割符的输入了!此处getline换成get是不行的,因为cin.get不会删除缓冲区中的分隔符’,‘  后续输入不能继续进行



                                             
4 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 丁克族老了怎么办知乎 2个月宝宝咳嗽怎么办 干活累的手疼怎么办 脸上长白色的癣怎么办 全身起红斑很痒怎么办 宝宝脖子红烂了怎么办 背上长红斑很痒怎么办 身上起风疙瘩很痒怎么办 身上起小包很痒怎么办 浑身起红包很痒怎么办 手太粗糙怎么办小窍门 小腿长疙瘩很痒怎么办 腿过敏起红疙瘩怎么办 肚子上起红疙瘩很痒怎么办 小蚂蚁咬了肿了怎么办 锦鲤鱼尾巴烂了怎么办 泰迪身上长白毛怎么办 鱼身上有红斑了怎么办 新买锦鲤不吃食怎么办 鱼身上有红血丝怎么办 大腿内侧有红色条纹怎么办 腿上出现红血丝怎么办 孕妇有脚气,很痒怎么办 孕晚期脚气很痒怎么办 孕期有脚气很痒怎么办 激光后留下色沉怎么办 腋下很黑怎么办怎样才能变白 屁股上长一块癣怎么办 鼻两侧一热发红怎么办 脸上起皮发红痒怎么办 自癜风发红发痒怎么办 脸又干又痒怎么办 脸发红还有点痛怎么办 脸过敏了红痒怎么办 脸两边一片红痒怎么办 婴儿大腿内侧破皮怎么办 宝宝大腿根淹了怎么办 大腿一走路就疼怎么办 下面痒怎么办用什么洗 长藓怎么办用什么药膏 小腿长湿疹很痒怎么办