- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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(无缓冲):直接从流读入数据,或者直接向流写入数据,而
您可能关注的文档
- CQ型TDP产品描述及参数表分解.doc
- CR2032钮扣电池检验规范分解.ppt
- 2016届内江市高三第四次模拟考试理综卷(2016.03)分解.doc
- 2016届宁夏石嘴山市第三中学高三上学期第四次适应性考试物理试题word版分解.doc
- 2016届宁夏银川一中高三上学期第三次月考物理试卷【解析版】分解.doc
- 2016届牛津高中英语高三一轮复习之模块基础自我检测复习题必修模块三UNIT1分解.doc
- 2016届牛津高中英语高三一轮复习之模块基础自我检测复习题选修模块六UNIT2分解.doc
- 2016届牛津高中英语高三一轮复习之模块基础自我检测复习题选修模块十UNIT2分解.doc
- 2016届青岛市高三生物上学期期中考试题(含答案)分解.doc
- 2016届全国高考语文新课标近义成语的选用分解.ppt
文档评论(0)