c语言中gets会把 n放在缓冲区吗,C语言清空输入缓冲区的N种方法对比

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, constchar * restrict format, …);

int scanf(constchar * restrict format, …);

int sscanf(constchar * restrict str, constchar * restrict format, …);

这里仅讨论输入函数在标准输入(stdin)情况下的使用。纵观上述各输入函数,

获取字符系列的的前三个函数fgetc、getc、getchar。以getchar为例,将在stdin缓冲区

为空时,等待输入,直到回车换行时函数返回。若stdin缓冲区不为空,getchar直接返回。getchar返回时从缓冲区中取出一个字符,并将其转换为int,返回此int值。

MINGW 4.4.3中FILE结构体源码:

typedefstruct _iobuf

{

} FILE; char* int char* int int int int char* _ptr;//指向当前缓冲区读取位置 _cnt;//缓冲区中剩余数据长度 _base; _flag; _file; _charbuf; _bufsiz; _tmpfname;

各编译器实现可能不一样,这里获取字符系列函数只用到_ptr和_cnt。

MINGW 4.4.3中getchar()实现:

__CRT_INLINE int __cdecl __MINGW_NOTHROW getchar (void)

{

return (--stdin->_cnt >= 0)

? (int) (unsignedchar) *stdin->_ptr++

: _filbuf (stdin);

}

其中stdin为FILE指针类型,在MINGW 4.4.3中,getc()和getchar()实现为内联函数,fgetc()实现为函数。顺便说一句,C99标准中已经加入对内联函数的支持了。

获取行系列的fgets和gets,其中由于gets无法确定缓冲区大小,常导致溢出情况,这里

不推荐也不讨论gets函数。对于fgets函数,每次敲入回车,fgets即返回。fgets成功返回时,将输入缓冲区中的数据连换行符’\n’一起拷贝到第一个参数所指向的空间中。若输入数据超过缓冲区长度,fgets会截取数据到前n-1(n为fgets第二个参数,为第一个参数指

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值