c语言输入输出缓冲区的概念

上传人:桔**** 文档编号:473916735 上传时间:2023-03-05 格式:DOC 页数:14 大小:57KB
返回 下载 相关 举报
c语言输入输出缓冲区的概念_第1页
第1页 / 共14页
c语言输入输出缓冲区的概念_第2页
第2页 / 共14页
c语言输入输出缓冲区的概念_第3页
第3页 / 共14页
c语言输入输出缓冲区的概念_第4页
第4页 / 共14页
c语言输入输出缓冲区的概念_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《c语言输入输出缓冲区的概念》由会员分享,可在线阅读,更多相关《c语言输入输出缓冲区的概念(14页珍藏版)》请在金锄头文库上搜索。

1、 c语言输入输出缓冲区的概念1.getchargetchar()是stdio.h中的库函数,它的作用是从stdin流中读入一个字符,也就是说,如果stdin有数据的话不用输入它就可以直接读取 了。而getch()和getche()是conio.h中的库函数,它的作用是从键盘接收字符。getchar带有显示。与前面两个函数的区别在于: getchar()函数等待输入直到按回车才结束(前提是缓冲区没有数据),回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。#include#includevoid main()char c;c=getchar();/getchar()在这

2、里它只返回你输入字符串的第一个字符,并把返回值赋值给cputchar(c);printf(nn);这个程序你运行一下,相信你又会有疑问了。这个就是从缓冲区中读取了例子。第一次getchar()时,确实需要人工的输入,但是如果你输了多个字符,以后的getchar()再执行时就会直接从缓冲区中读取了。#include#includevoid main()char c;while (c=getchar()!=n)printf(%c,c);printf(nn);程序运行时,首先停下来,等你输入一串字符串,输入完毕后,它把你输入的整个字符串都输出来了,咦,你不是说getchar()只返回第一个字符么,这

3、里怎么?因为我们输入的字符串并不是取了第一个字符就把剩下的字符串丢掉了,它还在我们的内存中,就好比,开闸放水,我们把水放到闸里去以后,开一次闸就放掉一 点,开一次就放掉一点,直到放光了为止,这里开闸动作就相当于调用一次getchar()。我们输入的字符串也是这么一回事,首先我们输入的字符串是放在 内存的缓冲区中的,我们调用一次getchar()就把缓冲区中里出口最近的一个字符输出,也就是最前面的一个字符输出,输出后,就把它释放掉了,但后面 还有字符串,所以我们就用循环把最前面的一个字符一个个的在内存中释放掉,直到不满足循环条件退出为止。例子中循环条件里的n实际上就是你输入字符串后的回车符,所以

4、意思就是说,直到遇到回车符才结束循环,而getchar()函数就是等待输入(或缓冲区中的数据)直到按回车才结束,所以实现了整个字符串的输出。当然,我们也可以把循环条件改一下,比如while (c=getchar()!=a),什么意思呢,意思就是遇到字符a就停止循环,当然意思是如果你输入“12345a213123n”那么只会输出到a,结果是12345a。再次注意:用getchar()它是从“流”中间去读取,所以第一个getchar()接受的是刚刚中断的流队列中即将出列的第一个字符(不限于回车符, 上面举过例子了),如果流队列不为空,执行getchar()就继续放水,直到把回车符也放空为止,空了之

5、后再在执行getchar()就停下等待你的输 入了;我们用getch()为什么每次都是等待用户的输入呢?因为getch()是从键盘接收,即时的接收,并不是从stdin流中去读取数据。补充:按键盘上的回车产生了2个字符:回车符(r)和换行符(n)。回车符r(CR:carriage return:倒车)使光标回到这行的首部,换行符(n)(new line)然后再换行。所以当输入字符w,并按下回车键以后。首先得到回车符。那个getchar函数结束了。 但是还存在一个换行符。所以如果用getchar()来做判断的时候。最好再写一次getchar()清除缓冲区的n.3如何清空输入缓冲区的内容?如果我想让

6、getchar()每次都能够等待用户输入的话就要清空缓冲区,下面就介绍方法(不同平台)C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。可以这样

7、忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。(这个是任何平台下都可以的)char sbuf1024;/ .fgets( sbuf, 1024, stdin );/ .在windows 的vc下面就可以这样了:for(int i=0;i10;+i)char ch=getchar();fflush(stdin); /每次都会有等待状态了这里说到gcc编译器没有定义fflush的实现,我们一般用getchar();来清除缓冲区.下面是我的讨论:先来一段code:#include main()char c;for(;(c=getchar()!=a;)printf(%c

8、,c);getchar();c=getchar();printf(%c,c);输入:ssss回车得到:ssss光标处(等待输入)说明:此时程序没有结束,进行到for循环,因为并没有字符a出现,所以还没跳出for循环.键入回车后,getchar依次从缓冲区内取出(for循环):ssssn如果我们输入:ssssa回车得到:ssss光标处(等待输入)说明:程序已经跳出for循环,但是由于我们用getchar();清除了换行n,后面第7句c=getchar();需要你输入一个字符(因为ssssa后面并没有新的字符),所以程序仍然没有结束.如果我们注释掉getchar();这一句,那么得到:ssss光标

9、处(程序结束)这个输入ssssa是的回车中的换行符n就被c=getchar();这一句读取并输出了。总结:键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够 多的getchar语句,就会依次读出缓冲区内的所有字符直到n.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复 利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消n的影 响,可以用getchar();来清除,这里getchar();只是取得

10、了n但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字 符.还要注意的是这里你在键盘上输入ssss看到的回显正是来自于getchar的作用,如果用getch就看不到你输入了什么.再引一篇文章:http:/ 输入设备-内存缓冲区-程序getchar你按的键是放进缓冲区了,然后供程序getchar你有没有试过按住很多键然后等一会儿会滴滴滴滴响,就是缓冲区满了,你后头按的键没有存进缓冲区.2.getchar()和getch()然后就可以给你讲了getchar是回车以后才进缓冲区getch是每次都进缓冲区用你的程序来说(我怎么觉得应该是n不是/n)其实你输入computer,没按回车之前,

11、 运行都停止在getchar()里头,根本没有进入循环,自然也没有运行printf当你一按回车,才从getchar出来,然后以后因为键盘缓冲区里头有东西,就一个一个字符getchar出来了想立刻回显,用getch就好了2.scanfscanf这个库函数比较奇怪,而且存在一定的缺陷,所以很多人都不用了,这里还是要简单介绍一下.scanf输入字符串,整型,实型等数据判断的方式都一样,回车,空格,tab键都认为是一个数据的结束,当然字符的话,一个字符就是结束了,回车,空格 等都有对应的ascii码,所以用scanf输入字符时要小心这些东东被当成字符输进去,而输入字符串和整型,实型等数据时这些都被当成

12、分隔符而不会被输 入到字符数组或变量里.当然如果输入格式不是%s%s而是%s,%s分隔符就是逗号了,这个讲到输入输出函数时再说.说了这么多举几个例子:#include int main()char n110;char n210;scanf(%s,n1);scanf(%s,n2);printf(n1=%s,n2=%s,n1,n2);输入:hello回车world回车得到:n1=hello,n2=wolrd光标处(程序结束)这里hello后面就是输入再多个回车,空格也不会被赋值到n2中的,因为他们只是分隔符.如果输入:hello回车光标处(等待输入)说明回车被认成分隔符,所以程序还要你输入一个字符

13、串来赋给n2.其实这时缓冲区里是有一个n被留下来的,程序改成这样:#include int main()char n110;char n210;char n3,n4;scanf(%s,n1);scanf(%s,n2);printf(n1=%s,n2=%s,n1,n2);n3=getchar();printf(%c,n3);/n4=getchar();/printf(%c,n4);输入:hello回车world回车得到:helloworldn1=hello,n2=wolrd光标处(程序结束)如果取消最后两行的注释,同样的输入得到:helloworldn1=hello,n2=wolrd光标处(等待

14、输入)说明此时缓冲区内只有一个n,第二个getchar就需要你再输入一个字符了,缓冲区内已经没有字符了.scanf不会把回车空格赋给字符串但是会赋给字符,就如同getchar一样,这时就要考虑n的存在了.比如:#include int main()char n110;char n2;scanf(%s,n1);scanf(%c,&n2);printf(n1=%s,n2=%d,n1,n2);输入:hello回车得到:n1=hello,n2=10光标处(程序结束) /10是n的ascii码.如果输入:hello 空格回车(一定要有回车,因为scanf也是要等回车,准确说是r才会去读缓冲区的.)得到:n1=hello,n2=32光标处(程序结束) /32是空格

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号