C语言清空输入缓冲区的N种方法对比时间讲义.doc

C语言清空输入缓冲区的N种方法对比时间讲义.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言清空输入缓冲区的N种方法对比时间:2010-04-20 10:57:36来源:网络 作者:未知 点击:295次 C语言中有几个基本输入函数: C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); //获取行系列 char *fgets(char * restrict s, int n, FILE * restrict stream); char *gets(char *s);//可能导致溢出,用fgets代替之。 //格式化输入系列 int fscanf(FILE * restrict stream, const char * restrict format, …); int scanf(const char * restrict format, …); int sscanf(const char * restrict str, const char * restrict format, …); 这里仅讨论输入函数在标准输入(stdin)情况下的使用。纵观上述各输入函数,获取字符系列的的前三个函数fgetc、getc、getchar。以getchar为例,将在stdin缓冲区为空时,等待输入,直到回车换行时函数返回。若stdin缓冲区不为空,getchar直接返回。getchar返回时从缓冲区中取出一个字符,并将其转??为int,返回此int值。 MINGW 4.4.3中FILE结构体源码: typedef struct _iobuf { char* _ptr;//指向当前缓冲区读取位置 int _cnt;//缓冲区中剩余数据长度 char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; } FILE; 各编译器实现可能不一样,这里获取字符系列函数只用到_ptr和_cnt。MINGW 4.4.3中getchar()实现: __CRT_INLINE int __cdecl __MINGW_NOTHROW getchar (void) { return (--stdin-_cnt = 0) ? (int) (unsigned char) *stdin-_ptr++ : _filbuf (stdin); } 其中stdin为FILE指针类型,在MINGW 4.4.3中,getc()和getchar()实现为内联函数,fgetc()实现为函数。顺便说一句,C99标准中已经加入对内联函数的支持了。 获取行系列的fgets和gets,其中由于gets无法确定缓冲区大小,常导致溢出情况,这里不推荐也不讨论gets函数。对于fgets函数,每次敲入回车,fgets即返回。fgets成功返回时,将输入缓冲区中的数据连换行符’ ’一起拷贝到第一个参数所指向的空间中。若输入数据超过缓冲区长度,fgets会截取数据到前n-1(n为fgets第二个参数,为第一个参数指向空间的长度),然后在末尾加入’ ’。因此fgets是安全的。通常用fgets(buf, BUF_LEN, stdin);代替gets(buf);。 格式化输入系列中,fscanf从文件流进行格式化输入很不好用。常用的还是scanf,格式化输入系列函数舍去输入数据(根据函数不同可能是标准输入也可能是字符串输入,如:sscanf)前的空白字符(空格、制表符、换行符)直至遇到非空白字符,然后根据格式参数尝试对非空白字符及后续字符进行解析。该系列函数返回成功解析赋值的变量数,若遇文件尾或错误,返回EOF。 =================分 割 线================= 提到缓冲区,就不得不提setbuf和setvbuf两个缓冲区设置函数,其声明如下: void setbuf(FILE * restrict stream, char * restrict buf); int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size); setvbuf的mode参数有: _IOFBF(满缓冲):缓冲区空时读入数据;缓冲区满时向流写入数据。 _IOLBF(行缓冲):每次从流读入一行数据或向流写入数据。如:stdio,stdout _IONBF(无缓冲):直接从流读入数据,或者直接向流写入数据,而没有缓冲区。如:stderr setbuf(stream, buf);在: buf == NULL:等价于(vo

文档评论(0)

希望之星 + 关注
实名认证
内容提供者

我是一名原创力文库的爱好者!从事自由职业!

1亿VIP精品文档

相关文档