(1)cin

在理解cin功能时,不得不提标准输入缓冲区。当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r)会被转换为一个换行符\n,这个换行符\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是7 ,而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。

(2)cin>>

cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符,即碰到分隔符,表示一个输入的结束。当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。

int a,b;
string c;
cin>>a>>b;
cin>>c;

输入是1[enter]2[enter]a[enter],则a=1.b=2,c=a;输入是[enter][enter]1[enter]..2a,则a=1,b=2,c=a;其中cin>>自动忽略了一开始的分隔符,直到遇到值赋给a,而且往后也是cin>>,只是写成了连续赋值的形式,所以b之前的分隔符也被忽略了。而且如果输入是1[enter]a[enter]因为输入a和定义的int型b类型不符,所以不会赋值成功。

为什么说cin>>对字符后面的残留在缓冲区的分隔符不做处理呢,我们可以验证下,后面会说到cin.getline()读取数据时,并非像cin>>那样忽略第一个换行符,getline()发现cin的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取,送入目标字符串后,再将换行符替换为空字符’\0’

int a;
string b;
cin>>a>>b;
cin>>a;
getline(cin,b);

输入:1[enter]hello[enter]  如果是用cin>>a>>b输入的话,这样两个>>都会忽略字符前的分隔符的,结果为a=1,b=“hello”,但是如果是第二个输入的方式,则getline不会将1后面的[enter]忽略掉,它会将其读取到b中,因为是换行符,所以替换成'\0',代表结束,则hello会被屏蔽,但是依然存放在缓冲区里,这个时候再来一个,就会赋值进去。

(3)cin.get()读取单个字符

cin.get()从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取

cin.get()的返回值是int类型,成功:读取字符的ASCII码值,遇到文件结束符时,返回EOF,即-1,Windows下标准输入输入文件结束符为Ctrl+z,Linux为Ctrl+d。cin.get(char var)如果成功返回的是cin对象,因此可以支持链式操作,如cin.get(b).get(c)。

char a,b;
a=cin.get();
cin.get(b);

输入e[enter],这样a=e,b=[enter],因为get不忽略分隔符。

(4)cin.get()读取一行

char a;
char array[20]={NULL};
cin.get(array,20);
cin.get(a);
cout<<array<<" "<<a<<endl;

输入:123213213[enter]  输出:array=123213213,a=[enter];读取一行时,遇到换行符时结束读取,但是不对换行符进行处理,换行符仍然残留在输入缓冲区。第二次由cin.get()将换行符读入变量a,换行符的ASCII码值为10。这也是cin.get()读取一行与使用getline读取一行的区别所在。getline读取一行字符时,默认遇到’\n’时终止,并且将’\n’直接从输入缓冲区中删除掉,不会影响下面的输入处理。

(5)cin.getline()

从标准输入设备键盘读取一串字符串,并以指定的结束符结束

getline函数从输入流中读取数据,一般作为string型的输入使用。cin.getline()实际上有三个参数,cin.getline(接受字符串的字符串地址,接受个数,结束字符) 
当第三个参数省略时,系统默认为'\0'

cin.getline与cin.get的区别是,cin.getline不会将结束符或者换行符残留在输入缓冲区中。

(6)getline()

和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数

在遇到需要输入一串带有空格的字符串的时候,要用getline(cin,s),因为cin>>s,遇到空格就会默认停止。

(7)cin.clear()和cin.ignore()

①cin.ignore清空了输入缓冲区的当前行,使上次的输入残留下的数据没有影响到下一次的输入,这就是ignore()函数的主要作用。其中,numeric_limits::max()不过是头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。 
②如果想清空输入缓冲区,去掉换行符,使用: 
cin.ignore(numeric_limits< std::streamsize>::max()); 清除cin里所有内容。

③cin.ignore();当输入缓冲区没有数据时,也会阻塞等待数据的到来。

https://blog.csdn.net/k346k346/article/details/48213811

http://www.cnblogs.com/flatfoosie/archive/2010/12/22/1914055.html

C++中关于输入cin的一些总结的更多相关文章

  1. 在C / C ++中清除输入缓冲区

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  2. C++输入cin详解

    输入原理: 程序的输入都建有一个缓冲区,即输入缓冲区.一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据.正因为cin函数是直接从缓冲区取数据 ...

  3. 控制input标签中只能输入数字以及小数点后两位

    js 代码如下: /* 控制input标签中只能输入数字 和小数点后两位 */ function checkNum(obj) { //检查是否是非数字值 if (isNaN(obj.value)) { ...

  4. Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载

    Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...

  5. 关于Eclipse中校验输入文件名的源代码

    Eclipse中测试文件名的方法. 也没有单独的分操作系统.在Talend时解决一个在文本框中输入名字有Bug的一个问题,这个是Eclipse中解决输入名字,对名字校验的部分源码. public IS ...

  6. textarea中限制输入字符长度

    要在textarea中限制输入字符的长度,比如在twitter中要限制字符为140个,可实现的方法有: 1. <textarea name="A" cols="45 ...

  7. Android中TextView输入字数统计和限制

    在Android开发应用的时候,文本编辑框中最多输入140个字,经常会显示还剩多少字以限制用户输入的字数, EditText content;//定义一个文本输入框 TextView hasnum;/ ...

  8. 解决Ubuntu下sublime中不能输入中文的问题

    解决Ubuntu下sublime中不能输入中文的问题 Ubuntu下安装sublime后,不能输入中文,而在其他软件中能正常输入,这是sublime的bug,解决方案是在通过shell在每次运行sub ...

  9. 在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程)

    在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程) 原文链接:http://www.360doc.com/content/14/1117/10/16948208_42571794 ...

随机推荐

  1. Java编程开发之浅析Java引用机制

    对于一个Java的对象而言,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象:一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程使用Java ...

  2. 计算机网络安全 —— 对称加密算法 DES

    一.对称加密算法概念 我们通过计算机网络传输数据时,如果无法防止他人窃听, 可以利用密码学技术将发送的数据变换成对任何不知道如何做逆变换人都不可理解的形式, 从而保证了数据的机密性.这种变换被称为加密 ...

  3. pytest:conftest.py文件

    一.fixture scope 为session 级别是可以跨 .py模块调用的,也就是当我们有多个 .py文件的用例时,如果多个用例只需调用一次fixture,可以将scope='session', ...

  4. Docker的Ubuntu镜像安装的容器无ifconfig命令和ping命令

    就这三步骤,下面的是实例不看也罢. apt-get update ###第一步一定要先执行这个更新下.不更新下面的安装命令会显示找不到网络包 //ifconfig apt install net-to ...

  5. Crunch

    Crunch 目录 1. 简介 2. 命令格式 3. options可选参数 3.1 -b number[type] 3.2 -c number 3.3 -d numbersymbol 3.4 -e ...

  6. YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details. data = yaml.load(file_data)

    YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsa ...

  7. 像羽毛一样轻的MVVMLight(一)(MVVM 和 MVVMLight简介)

    致敬 在此致敬翁智华大佬,感谢大佬为后辈们写下如此详细的文档,本文将在原文基础上添加些自己的理解,希望这样优秀的文档广为流传. 原文请参考 https://www.cnblogs.com/wzh201 ...

  8. UVA11694 Gokigen Naname题解

    目录 写在前面 Solution Code 写在前面 UVA的题需要自己读入一个 \(T\) 组数据,别被样例给迷惑了 Solution 每个格子只有两种填法且 \(n \le 7\),暴力搜索两种填 ...

  9. Java中String对象创建机制详解()

    一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...

  10. centos安装Qt

    转:http://blog.csdn.net/wavelee/article/details/7855727 在编译Qt4.8.6版本的库时,在配置时 ./configure 出现了如下的错误: Ba ...