博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
输入执行GetChar缓存机制剖析
阅读量:5065 次
发布时间:2019-06-12

本文共 2389 字,大约阅读时间需要 7 分钟。

查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧!

    与缓存区相关最常见的操纵就是字符的输入与输出操纵getchar,getc,getch,getche,gets系列函数。

    第一个例子(getchar有关)

    

#include
int main(){ int ch; ch=getchar(); ch=getchar(); printf("%d\n",ch); return 0;}

    代码如上,当输入一个字符按下回车后程序没有等待你二次输入就结束了,而且无论输入什么运行结果均是10,是不是是很奇怪(反正我第一次碰到时感觉是很奇怪),更奇怪的是当你一次性输入多个字符如abcd结果又正确的打印出了98,为什么呢?这就是缓冲区的原因。

    解释如下:getchar定义在stdio.h文件中,我们在stdio.h中可以找到其相关的定义:

    

#define getchar()         getc(stdin)//即getchar等同于调用getc(stdin)

    我们又找到getc的定义

#define getc(_stream)     (--(_stream)->_cnt >= 0 \                ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))

    将其开展即得:

if(--(stdin)->_cnt>=0)      return 0xff&*(stdin)->ptr++;
else        return filbuf(stdin);

    代码译如下stdin是标准输入流,查看MSDNstdio.h中可以看到定义如下:

    Stdio.h中:

#define stdin  (&_iob[0])

    跟踪即可得:

_CRTIMP extern FILE _iob[];

    从上面代码可得_iobFILE结构类型的,查看stdio.h中可以看到FILE结构体定义如下:

struct _iobuf {        char *_ptr;        int   _cnt;        char *_base;        int   _flag;        int   _file;        int   _charbuf;        int   _bufsiz;        char *_tmpfname;        };

    从FILE结构中我们可以失掉了上面getc宏定义中使用的_cnt,_ptr成员,但这些都是次要的,我们应该不难发现有这样几个成员_bufsize,_base分离对应的是缓冲区大小,缓冲区基地址,从这里失掉一个显而意见的论断就是getchar函数使用了缓冲机制。(_cnt对应的是缓冲区的输入的字节数目,_ptr对应的是读指针的位置)

    getc宏定义详解

--(stdin)->_cnt>=0
    每日一道理
闷热的天,蝉儿耐不住寂寞地不停在鸣叫,我孤单一人,寂静的身旁没有一个知音,想疯狂地听摇滚乐,听歇斯底里的歌声,那只为逃避无人的世界里那浓烈的孤单气息。一个人是清冷,两个人便是精彩,于是,莫名的冲动让我格外想念旧日的好友,怀念过去的日子,尽管不够现实的遐想追回不了曾经一切,但却希望思绪可以飞扬于闭上双目后的世界中,印有微笑,印有舞动的身姿,翩翩起舞……

    此句判断是不是缓冲区内有数据,有的话就减一(表示又读了一个),并读取数据return 0xff&*(stdin)->ptr++,读完成后,将读指针向前移一个位置【主要】

    好了,讲了这么多都是铺垫,现在回到正题为什么会涌现上述结果:)

    涌现上述结果追根结底还是由于getchar函数使用了缓冲(看了上面的,我想大家也知道了,确实使用了缓冲)当输入一个字符按下回车后程序没有等待你二次输入就结束了,而且无论输入什么运行结果均是10这是因为当用户输入了一个字符后,并按下回车后,缓冲中会存入用户输入的字符以及换行键的ASCII(10 ~)【略去的回车的ASCII13,可能是为了跨平台,在Linux下,回车后就是换行10Windows下回车是先回车回到首行,再换行,即13 10(执行第一次getchar实际上是执行getcelse语句,填充缓存区后_cnt=2,_prt指向0位置,执行完后_cnt=1,_prt指向1位置),第二次执行getchar时,调用getc不会再执行else语句,执行的是if语句,故第二次不再等待用户输入了,直接执行,执行后cnt=0,prt指向位置2,并返回ptr指向位置1时的结果,即10,由于10为换行键,当执行碰到此时,会在执行完后清空缓存,ptr从新指向了位置0cnt=0

    当输入abc的时候分析一样,只不过扫行了第二个getchar后,cnt=2,ptr指向了位置2

    本文Doc文档已上传,

文章结束给大家分享下程序员的一些笑话语录: 警告

有一个小伙子在一个办公大楼的门口抽着烟,一个妇女路过他身边,并对他 说, “你知道不知道这个东西会危害你的健康?我是说, 你有没有注意到香烟 盒上的那个警告(Warning)?”
小伙子说,“没事儿,我是一个程序员”。
那妇女说,“这又怎样?”
程序员说,“我们从来不关心 Warning,只关心 Error”

--------------------------------- 原创文章 By

输入和执行
---------------------------------

转载于:https://www.cnblogs.com/xinyuyuanm/archive/2013/05/27/3102336.html

你可能感兴趣的文章
4.9 Parser Generators
查看>>
centos下安装nginx
查看>>
redis集群如何清理前缀相同的key
查看>>
redis7--hash set的操作
查看>>
20.字典
查看>>
Python 集合(Set)、字典(Dictionary)
查看>>
oracle用户锁定
查看>>
(转)盒子概念和DiV布局
查看>>
Android快速实现二维码扫描--Zxing
查看>>
获取元素
查看>>
nginx+lighttpd+memcache+mysql配置与调试
查看>>
ubuntu12.04 启动apache2 对.htaccess 的支持
查看>>
proxy写监听方法,实现响应式
查看>>
前端工具----iconfont
查看>>
Azure Site Recovery 通过一键式流程将虚拟机故障转移至 Azure虚拟机
查看>>
Hello China操作系统STM32移植指南(一)
查看>>
cocos2dx CCEditBox
查看>>
VC++2012编程演练数据结构《8》回溯法解决迷宫问题
查看>>
第一阶段冲刺06
查看>>
WIN下修改host文件并立即生效
查看>>