文档详情

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

发布:2017-04-17约1.56万字共19页下载文档
文本预览下载声明
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
显示全部
相似文档