豪仕知识网--知识就是力量!

微信
手机版
生活常识

C语言中getchar函数的缓存机制/c语言中getchar函数的作用

作者 :笑傲江湖 2024-01-06 16:31:40 围观 : 评论

C语言中getchar函数的缓存机制/c语言中getchar函数的作用

豪士君测试所用平台

现在还有好多人不知道C语言中getchar函数的缓存机制,接下来我们小编就来分享一下。

与缓存区相关最常见的操作就是字符的输入与输出操作getchar,getc,getch,getche,gets系列函数。第一个例子(与getchar有关):

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

代码如上,当输入一个字符按下回车后程序没有等待你二次输入就结束了,而且无论输入什么运行结果均是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))
◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

将其展开即得:

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

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

HTTP://WWW.haoz.net豪仕知识网采集不好玩哦◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐撒旦法师打发斯蒂芬

MSDN:

豪仕知识网http://www.haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

FILEstructureStoresinformationaboutcurrentstateofstream;usedinallstreamI/Ooperations.STDIO.H

◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

Stdio.h中:

#define stdin  (&_iob[0])

跟踪即可得:

_CRTIMP extern FILE _iob[];
◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

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

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

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识http://www.Haoz.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

getc宏定义详解

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

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

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

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

HTTP://WWW.haoz.net◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐◐豪仕知识网

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

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

与缓存区相关最常见的操作就是字符的输入与输出操作getchar,getc,getch,getche,gets系列函数。第一个例子(与getchar有关):

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲豪仕知识网HtTp://▲▼▲▼▲

代码如上,当输入一个字符按下回车后程序没有等待你二次输入就结束了,而且无论输入什么运行结果均是10,是不是很奇怪(反正我第一次遇到时感觉是很奇怪),更奇怪的是当你一次性输入多个字符如abcd结果又正确的打印出了98,为什么呢?这就是缓冲区的原因。解释如下:getchar定义在stdio.h文件中,我们在stdio.h中可以找到其相关的定义:

#define getchar()         getc(stdin)//即getchar等同于调用getc(stdin)
◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HTTP://WWW.hAoz.net███████████████████████████东方金报网

我们又找到getc的定义

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

将其展开即得:

 if(--(stdin)->_cnt>=0)      return 0xff&*(stdin)->ptr++;                   else                         return filbuf(stdin);
◐◐◐◐●☛█▼▲豪仕知识网███████http://www.haOZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

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

MSDN:

FILEstructureStoresinformationaboutcurrentstateofstream;usedinallstreamI/Ooperations.STDIO.H

◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲HtTp://wWW.haoz.net豪仕知识网●●●●●●●●●●●●●●●●●●●●●●●●●●

Stdio.h中:

#define stdin  (&_iob[0])

跟踪即可得:

_CRTIMP extern FILE _iob[];

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

http://www.haoz.net●☛█▼▲◐●☛█▼▲◐◐◐◐●☛█▼▲◐豪仕知识网●☛█▼▲豪仕知识网

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

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识网HTtp://www.haoZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

getc宏定义详解

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识网HTtp://www.haoZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

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

●☛█▼▲豪仕知识网◐◐◐◐●☛█▼▲◐◐◐◐●☛█▼▲

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

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

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

◐◐◐◐●☛█▼▲豪仕知识网███████豪仕知识网HTtp://www.haoZ.net▼▲▼▲▼▲▼▲▼●●●●●●●▼▲▼▲▼▲

以上就是C语言中getchar函数的缓存机制的相关内容分享,字数约5035字,希望这对大家有所帮助!豪仕知识网往后会继续推荐C语言中getchar函数的缓存机制相关内容。

相关文章