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:
- #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不会删除缓冲区中的分隔符’,‘ 后续输入不能继续进行
补充: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的长度,因为至少要留一个位置存放结束符'\0',后面这个还要探讨一下)
有关getline函数:参考一下这篇博客:https://blog.csdn.net/qq_33001647/article/details/54863824
c++之cin/cin.get/cin.getline()详解的更多相关文章
- cin 对象取值过程详解
突然又空,鉴于对cin对象的去值机制还不是很了解,就探究一番,并且记下来,方便以后复习. #include <iostream> int main(void) { using namesp ...
- cin详解(cin.get()、cin.getline()、cin.clear()、cin.sync())
在C中,输入输出用scanf和printf,在输入数据的同时还需说明数据的类型,如果输入数据较多,那就很麻烦,而C++中也有相似的东西cin和cout,它们来自C++的一个名叫" iostr ...
- cin详解(get()、getline()、clear()、sync())
简述 在C中,输入输出用scanf和printf,在输入数据的同时还需说明数据的类型,如果输入数据较多,那就很麻烦,而C++中也有相似的东西cin和cout,它们来自C++的一个名叫" io ...
- [原创]cin、cin.get()、cin.getline()、getline()、gets()、getchar()的区别
这几个输入函数经常搞不清具体特点和用法,这里稍作总结 一.cin>> 1.最基本用法,输入一个变量值 2.输入字符串,遇“空格”.“TAB”.“回车”结束,比如输入“hello world ...
- C++中关于cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
1.cin>> 用法1:最基本,也是最常用的用法,输入一个数字: 注意:>> 是会过滤掉不可见的字符(如 空格 回车,TAB 等) cin>>noskipws> ...
- C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符
在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员 ...
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法----细节决定成败 (sort用法)
C++中cin.cin.get().cin.getline().getline().gets()等函数的用法 学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有 ...
- C++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行) 1.cin 2.cin.get ...
- cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
学C++的时候,这几个输入函数弄的有点迷糊:这里做个小结,为了自己复习,也希望对后来者能有所帮助,如果有差错的地方还请各位多多指教(本文所有程序均通过VC 6.0运行)转载请保留作者信息:1.cin1 ...
随机推荐
- 在c++11中你最惊讶的新feature是什么?
对我来说,我最惊讶竟然把对于多线程的支持加到标准中了.真的想不明确,对于c++这样一种语言.怎么会加进这个东西. 1. 由于各个平台的不同,对于多线程的支持会有很多平台独有的特色.这样c++标准的定义 ...
- 【翻译自mos文章】检查$ORACLE_HOME是否是RAC的HOME的方法以及relink RAC的Oracle binary的方法
检查$ORACLE_HOME是否是RAC的HOME的方法以及relink RAC的Oracle binary的方法 来源于: How to Check Whether Oracle Binary/In ...
- PHP网站http替换https
PHP网站http替换https
- Jenkins和Maven构建持续集成
真是运维的福利,不用在敲Linux命令了 须要的工具:Linux或window.Jenkins.tomcat7.Jdk.maven.项目部署的war包 1.首先从Jenkins官网下载最新的Jenki ...
- Tessellation (曲面细分) Displacement Mapping (贴图置换)
DirectX 11 Tessellation (曲面细分)-什么是 Tessellation (曲面细分) ? 它为什么可以起到如此关键的数据? 随着近期人们对 DirectX 11 的议论纷纷,你 ...
- allegro设置鼠标滚轮放大缩小
allegro设置鼠标滚轮放大缩小 allegro16版本以增加可以通过鼠标滚轮进行PCB的放大缩小.具体方法如下: 首先在HOME路径下找到PCBENV文件夹,进入该文件夹打开ENV文件. 在ENV ...
- JavaScript2种构造函数创建对象的模式以及继承的实现
第一种模式: function Person(){ } Person.prototype.say=function(){ alert('hello'); } var person=new Person ...
- NTAG 标签
NTAG 标签 这里描述针对 NTAG213.而 NTAG215/216只是容量不同,其它功能都一样.  UID UID 有 7 bytes.上图中有 9 bytes 的 serial number ...
- Struts2 原理(转载)
图来源于Struts2官方站点,是Struts 2 的整体结构. Struts2框架由3个部分组成:核心控制器FilterDispatcher.业务控制器和用户实现的业务逻辑组件.在这3个部分里,St ...
- 模式识别之不变矩---SIFT和SURF的比较