• c++之cin/cin.get/cin.getline()详解


     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:

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. int main()  
    5. {  
    6.     char a[10],b[10];  
    7.     cin>>a;cin>>b;  
    8.     cout<<a<<endl<<b<<endl;  
    9. }  

    输入: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: 

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. int main()  
    5. {  
    6.     char a,b,c,d;  
    7.     a = cin.get();  
    8.     b = cin.get();  
    9.     c = cin.get();  
    10.     d = cin.get();  
    11.     cout<<int(a)<<','<<int(b)<<','<<int(c)<<','<<int(d)<<endl;  
    12. }  

    输入:[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''’)。但当计算sizeof(a)时,还是现实为10

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

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

    输入:12345[enter] 

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

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

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

    输入:123456789012[enter]

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

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

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

    输入:123456789012[enter]

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

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

    (3)三参数

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

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

    程序3: 

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. int main()  
    5. {  
    6.     int i;  
    7.     char a[10];  
    8.     cin.get(a,10,'.');  
    9.     cout<<a;  
    10. }  

    输入: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]

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. int main()  
    5. {  
    6.     char a[10];char b;  
    7.         cin.get(a,10);  
    8.     cin.get(b);  
    9.     cout<<a<<endl<<int(b);  
    10. }  

    输入:12345[enter]

    输出:12345 【换行】 10

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

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. int main()  
    5. {  
    6.     char a[10];char b;  
    7.         cin.getline(a,10);  
    8.     cin.get(b);  
    9.     cout<<a<<endl<<int(b);  
    10. }  

    输入: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

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. int main()  
    5. {  
    6.     char a[10];char b;  
    7.     cin.get(a,10,',');  
    8.     cin.get(b);  
    9.     cout<<a<<endl<<b;  
    10. }  

    输入:12345,[enter]

    输出:12345【换行】,

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

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. int main()  
    5. {  
    6.     char a[10];char b;  
    7.     cin.getline(a,10,',');  
    8.     cin.get(b);  
    9.     cout<<a<<endl<<int(b);  
    10. }  


    输入:12345,[enter]

    输出:12345【换行】10

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

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

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

    1. #include<iostream>  
    2. using namespace std;  
    3.   
    4. int main()  
    5. {  
    6.     char a[5][10];  
    7.     int i;  
    8.     for(i=0;i<4;i++)  
    9.         cin.getline(a[i],10,',');  
    10.     cin.getline(a[i],10);  
    11.   
    12.     for(i=0;i<5;i++)  
    13.         cout<<a[i]<<endl;  
    14. }  



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

    补充:getlinge()函数

    getline函数其实有两个:

      一个是全局函数,include<cstring>, 原型是istream& getline( istream& is, string& str, char delim)与 istream& getline( istream& is, string& str) ,得到的字符串存在一个string类型的str里。

      另一个是iostream类的成员函数, include<iostream>, 原型是 istream& getline( char * str, streamsize n, char delim ) istream& getline( char * str, streamsize n ) , 得到的字符串存在一个C-style字符数组str里。(值得注意的是,这个n应该小于字符数组str的长度,因为至少要留一个位置存放结束符'',后面这个还要探讨一下)

      

      有关getline函数:参考一下这篇博客:https://blog.csdn.net/qq_33001647/article/details/54863824

  • 相关阅读:
    括号序列
    秘密信息
    大奖赛
    订单
    摆花
    利用spring自己实现观察者模式
    Spring操作mongo排序,限制查询记录数
    Hbse的读写过程
    使用aop记录数据库操作的执行时间
    分享一个关于jackson的Json工具类
  • 原文地址:https://www.cnblogs.com/cthon/p/9198686.html
Copyright © 2020-2023  润新知