测试环境:VS2013+win32+debug

在工作过程中,发现cin的结束符根据不同的成员函数会存在是否被处理的情况,再次进行记录验证。

1、cin获取缓冲区数据

常用方法包括cin>>, cin.get, cin.getline,getline

cin>>

cin是从键盘中读取想要的数据,以空格,tab以及换行作为结束符。

测试代码:

#include<iostream>
#include<string>
using namespace std;int main(){char a;int b;double c;string d;cin >> a >> b >> c >> d;cout << a << " " << b << " " << c << " " << d << endl;system("pause");return 0;
}

运行上述程序
我们可以看到运行结果如下:

在这里需要特别注意的是,
1、cin在检测到实际有效的数据,即非结束符数据时,会忽略数据前所有的结束符等待实际有效数据。
2、读取到有效数据后,之后的结束符cin不会进行处理,而是把它留在缓冲区,由之后的读取操作进行处理,之所以cin连续的时候,不会出现结束符异常问题。是因为之后的cin会忽略掉之前留下的结束符。
3、如果不想忽略空白字符使用noskipws,noskipws 可以做到不忽略任意地方的空格。std::cin >> std::noskipws >> c1 >> c2 >> c3 >> c4;

cin.get

函数原型:

 1、int cin.get();2、istream& cin.get(char& var);3、istream& get ( char* s, streamsize n );4、istream& get ( char* s,  streamsize  n, char delim )。

其中3和4的差别在于是否可以人为指定结束符,char delim.

单个char:

测试程序(1,2一起测试):

#include<iostream>
#include<string>
using namespace std;int main(){char a;char b;a = cin.get();cin.get(b);cout << a << " " << b << endl;system("pause");return 0;
}

结果:

从上面可以看出,
1、cin.get()并没有忽略结束符,而是直接进行了读取,所以出现了上面只输入了一个字符a,然后回车,程序就执行完成的情况。
2、cin.get()的返回值是int类型,成功则返回读取字符的ASCII码值,遇到文件结束符时,返回EOF,即-1。
3、cin.get(char var)如果成功返回的是cin对象,因此可以支持连续操作,如cin.get(b).get©

字符数组:

测试程序:

#include<iostream>
#include<string>
using namespace std;int main(){char a[20];char b;   char c[20];cin.get(a,20);cin.get(b);cin.get(c, 20, '7');cout << a << " " << b << " " << c << endl;system("pause");return 0;
}

运行结果:

从结果我们可以看出,
1、cin.get()的3和4原型在于结束符的人为设定。
2、cin.get()在读取字符数组的时候,仍然不会处理结束符。所以出现,输入完a之后,在进行输入,程序终止。
3、istream& get ( char* s, streamsize n );与cin.getline()功能类似。

cin.getline()

函数原型:

1、istream& getline(char* s, streamsize count); //默认以换行符结束
2、istream& getline(char* s, streamsize count, char delim);

测试程序:

#include<iostream>
#include<string>
using namespace std;int main(){char a[20];char b[20];cin.getline(a, 20);cin.getline(b, 20);cout << a << " " << b << endl;system("pause");return 0;
}

结果:

从结果可以看出:
1、cin.getline()。不会把结束符留下来,而是直接在本次输入完成后,就处理掉了。

getline

测试程序:

#include<iostream>
#include<string>
using namespace std;int main(){string test;getline(cin, test);//不阻塞cout << "test:" << test << endl;system("pause");return 0;
}

结果:

可以看出:
1、getline();并不会忽略结束符,而是直接进行读取。

cin清空输入缓冲区

cin在使用过程中,因为结束符导致的问题很多,所以可以通过清空缓冲区的方式来去除影响。

函数原型:

istream &ignore( streamsize num=1, int delim=EOF );

函数的作用,是跳过num的字符或者遇到delim终止字符时提前结束。

测试程序:

#include<iostream>
#include<string>
using namespace std;int main(){char a[20];char b[20];cin.get(a, 5);cin.ignore(numeric_limits<std::streamsize>::max(), '\n');cin.get(b, 20);cout << a << " " << b << endl;system("pause");return 0;
}

结果:

由结果看出:
1、程序中使用cin.ignore()成功的去除掉了之前的结束符,从而使我们的cin.get()成功完成读取,其中,numeric_limitsstd::streamsize::max()代表的是最大值,可以使用任意整数代替。如果清空整个缓冲区,可以使用cin.ignoer(numeric_limitsstd::streamsize::max()).
2、cin.ignore()如果缓冲区没有数据的话,会阻塞等待数据的到来。

但是从上面我们看到,我们最初输入的12345,却没有完整打印,这是因为我们限定了长度5,但是同时需要预留结束位“\0”,之后的5和换行符被留在缓冲区。

C++ cin详细用法相关推荐

  1. C++中 cin 的详细用法

    1.cin 简介 cin是C++编程语言中的标准输入流对象,即istream类的对象.cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘.此外,cout是流的对象,即ostream类的 ...

  2. C++ ofstream和ifstream详细用法

    ofstream 和 ifstream 详细用法 导读 一.打开文件 二.关闭文件 三.读写文件 1.文本文件的读写 2.二进制文件的读写 四.检测EOF 五.文件定位 格式化输入输出: 1 整数数据 ...

  3. c语言ofstream,C++ ofstream跟ifstream详细用法以及C语言的file用法

    C++ ofstream和ifstream详细用法以及C语言的file用法 ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间; 在C++中,有一个strea ...

  4. Android命令行工具logcat详细用法!

    logcat是Android中一个命令行工具,可以用于得到程序的log信息. 见板凳详细说明!      本贴内容来自网络,引用网址为:http://hi.baidu.com/%C9%C1%D2%AB ...

  5. __declspec关键字详细用法

    __declspec关键字详细用法 2009-01-21 16:23 __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式.其它的有关存储方式的修饰符如static与ext ...

  6. mysql left/right join算法效率分析_mysql left join,right join,inner join超详细用法分析

    MySQL left join,right join,inner join超详细用法分析 下面是例子分析 表A记录如下: aID        aNum 1           a20050111 2 ...

  7. python sort怎么用,Linux Sort命令详细用法(有实例)

    Linux Sort命令详细用法(有实例) sort是在Linux里非常常用的一个命令,管排序的,集中精力,五分钟搞定sort,现在开始! Linux sort命令进阶: 1 sort的工作原理 so ...

  8. vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn

    vue性能优化-------vendor优化详细用法(瘦身),减小体积,引入cdn 原创ChrisWang_ 最后发布于2019-05-24 10:25:58 阅读数 1332  收藏 展开 vue性 ...

  9. oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法

    嘿嘿,今天在论坛里看了一篇帖子,讨论ltrim() 函数的详细用法,下面我借几个高手的回答总结一下: 先看几个实例: SQL> select ltrim('109224323','109') f ...

最新文章

  1. 批量修改文件权限 和所有者 chown nobody:nobody * -R chmod 775 * -R
  2. python编程案例教程答案-Python程序开发案例教程
  3. 统一建模语言(UML)介绍
  4. 列字段通用excel导入修改版
  5. Subject 在 SAP Spartacus Popover Component 中的应用
  6. 利用S_MEMORY_INSPECTOR分析内存泄漏问题
  7. leetcode145. 二叉树的后序遍历 意想不到的骚操作
  8. html checked属性值,HTML复选框的checked属性的值是多少?
  9. shell死循环(whilefor)
  10. sever client
  11. linux性能分析top iostat vmstat free,Linux性能分析工具(vmstat,iostat,sar)
  12. html网页框架案例代码,HTML网页框架代码
  13. IOS OpenGL ES 图像扩展边缘彩色模糊 GPUImageRGBDilationFilter
  14. C语言实现多人坦克大战
  15. Install Mysql MMM On Redhat6.3
  16. 【C#】 .NET Reflector 安装与学习
  17. InnoDB:page_cleaner:1000ms intended loop took [xxx]ms解决
  18. 诺基亚结盟微软走上ARM星光大道
  19. TCP/IP:使用wireshark进行网络数据分析
  20. 刺激战场电脑版android,绝地求生刺激战场怎么用电脑玩 绝地求生刺激战场pc版安装攻略...

热门文章

  1. python占位符使用_python占位符使用教程
  2. 思维导图的正确阅读规则与方式
  3. ubuntu安装oracle
  4. rabbitMQ:绑定Exchange发送和接收消息(fanout)
  5. Flutter的Stateless Widgets
  6. git rebase 变基命令——移花接木
  7. oracle 归档日期,Oracle中归档日期满报错解决方法
  8. 掌握Mock摆脱后端同学的束缚
  9. 对游戏某个系统的分析
  10. 猿圈php,路飞学城-学习文档