热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

cin的个人理解

标准输入设备cin是指从键盘输入数据,而我们知道从键盘输入的时候是使用了缓冲的(windows中是行缓冲),系统将输入数据放到程序的缓存内存中是以Enter键为标志的。也就是说

标准输入设备cin是指从键盘输入数据 , 而我们知道从键盘输入的时候是使用了缓冲的(windows中是行缓冲) ,系统将输入数据放到程序的缓存内存中是以Enter键为标志的。

也就是说 我们输入了一行数据(可以只一个字符或者N个字符时)时,这些数据先是被系统检测到后存放在系统的某处(如系统中的内存,但不是程序的内存中),  而只有当我们按下Enter键后,系统才会将输入的这一行数据存放到我们的程序的输入缓存中.


例如:假设我们程序的输入缓存用char buf[MAX_SIZE]数组表示,

那么当我们遇到第一条输入语句cin>>x>>y>>z;(假设为char类型),由于是第一次程序中的第一条输入,故此时的输入缓存还是空的。程序运行到此处时会先检测自已的输入缓存是否为空。如果为空,则会再检测是否遇到结束符EOF (EOF标志并不出现在输入缓存中) 。如果遇到EOF,则输入语句直接返回;如果没有遇到EOF结束标志,则输入操作将阻塞,即程序暂停等待用户输入。

然后我们开始输入数据,但是在我们按下回车符之前,行缓存都一行为空,程序就一直等待。直到我们按下Enter后,
我们输入的数据比如为"abcde"才会被系统存放到程序的输入缓存中。这时候cin>>x>>y>>z;就会发现输入缓存不为空了。然后x,y,z就会分别读入数据了。x='a' ,y ='b', z= 'c';     注意,此时程序的输入缓存中的数据并没完 即”de" 还在缓存里。

程序继续运行到某处的输入语句cin>>u>>v >>w; (也为char类型)  ,然后发现输入缓存中还有数据,则u = 'd' ,v = 'e'; 但将给w赋值的时候发现没数据了,此同就同上了,程序又开始等待  (同上)  .

验证程序(c++):

int main()
{
char x,y,z,u,v,w;
cout<<"Please enter the data :";
cin>>x>>y>>z;
cout<<"then x = "<int main()
{
int x = 0;
cout<<"enter a data for int x:";
cin>>x;
cout<
char c = 'p';
cout<<"cin的标志位:"<<(bool)cin< cin>>c;
cout<<"c = "< cin.clear(); //清除cin的错
cout<<"cin的标志位:"<<(bool)cin< cin>>c;
cout<<"c = "<}

  • 再来看看while(cin>>x)结束的方式  (x为任意类型)
1.可以用 上面的方法,使cin的标志位置为false.但这种方法得在while后面再用cin前,使用cin.clear()清除错误。  (cin>>x的返回值为cin的引用.相当于cin>>x,while(cin){})
2.可以在输入新的一行时输入^z   (键盘上按下 ctrl+z) 回车,这种情况下cin也标志位也会置为false.  注意:^z得出现在输入的每行的第一个才有效!

下面就我个人理解来解释下 ^z:

^z 相当于文件输入流的EOF标志。

从上面可知cin>>x的时候,程序是先检测输入缓存是否为空。若为空,则再检测EOF标志。若无EOF,则程序等待用户输入。注:^z并不会进入到输入缓存中

每按一次回车时候,程序就执行下上面的步骤。 

我们可以认为 ^z 符号只在一次回车时有用。即当输入 'abc'^z的时候, 程序执行不到检测EOF时,就已经有输入了(此时这次的^z就已经失效了,因为它的前面有输入了)

故:^z ( ctrl+z)结束时,得在行首输入!  后面要再次使用cin时,得再调用cin.clear();

验证如下:

int main()
{
int c;
while(cin>>c){
cout<<"in while"< cout<<"请在行首按下^z结束(ctrl+z) 或者输入字母结束 "< }
cout<<"cin 的状态:"<<(bool)cin< cin.clear();//然后就可以接着用cin了
}



本文完。如有错误,还请各个高手指正。

转载请注明出处.







推荐阅读
  • 对象内存地址
    主  题 ... [详细]
  • 为了加速游戏,一提起汇编语言,大家也许会感到很神秘。其实如果你学起来就会发现,它并非想象中那样难。特别是内嵌汇编,由于它和C++紧密结合,使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来 ... [详细]
  • ProblemDescriptionAninchwormisatthebottomofawellninchesdeep.Ithasenoughene ... [详细]
  • 第3章 感受(一)——3.1. Hello world 经典版
    [回到目录]白话C++第3章.感受Helloworld!,HelloC++,我们来了!3.1.Helloworld经典版毫无疑义,一 ... [详细]
  • CC++如何复制 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • 从vc6.0转到vs20052008等出现的错误详解(HYD整理)最近开发平台由VC6.0升级至VS2005,需要将原有的项目迁移,特将碰到的问题归纳如下:1消 ... [详细]
  • 第五周项目一——体验常成员函数(1)
    设计平面坐标点类,计算两点之间距离、到原点距离、关于坐标轴和原点的对称点等。在设计中,由于求距离、求对称点等操作对原对象不能造成任何改变,所以,将这些函数设计为常成员函数是合适的,能够避免数据成 ... [详细]
  • 要求:海伦公式:ssqrt(p*(p-a)*(p-b*)(p-c)),其中p(a+b+c)2,a,b,c为三角形的三个边。定义两个带参数的宏,一个用来求p,另一个用来求s题目分 ... [详细]
  • Here是指向最小代码的链接,如果消失了, ... [详细]
  • 名字空间是为了防止名字污染在标准C++中引入的。它可以将其中定义的名字隐藏起来,不同的名字空间中可以有相同的名字而互不干扰,使用时用域操作符(::)来引用。namespace名字{ ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
author-avatar
区小靜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有