gets函数和fgets函数

1、 gets函数

 gets函数从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。

gets函数可以无限读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。这个事实导致gets函数只适用于玩具程序,为了避免这种情况,我们可以用fgets(stdin) (fgets实际上可以读取标准输入,即大多数情况下的键盘输入)来替换gets()。在V7的手册(1979年)中说明:为了向后兼容,gets删除换行符,gets并不将换行符存入缓冲区(以‘\0’替代)

注意:

因为Linux 和 windows的文件在换行符上编码不一样,linux的换行是\0,windows的换行是\13\0.

LINUX下编译C程序时,会出现警告:warning: the `gets' function is dangerous and should not be used.

2、fgets函数

fgets函数从文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize-1个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行

函数成功将返回buf,失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的,应该借助feof函数或者ferror函数来判断。


注意:

gets从终端读入是的字符串是用\0结束的,而fgets是以\n结束的.


例子:

  1. fgets()函数原型  
  2. fgets(char * s,int size,FILE * stream);//用fgets(tempstr,9,stdin)//tempstr 为char[10]变量,9为要输入的字符串最大长度(最后会补上'\0'),stdin为从标准终端输入。    
fgets()函数原型
fgets(char * s,int size,FILE * stream);//用fgets(tempstr,9,stdin)//tempstr 为char[10]变量,9为要输入的字符串最大长度(最后会补上'\0'),stdin为从标准终端输入。  

  1. #include <stdio.h>    
  2. int main ( ) {    
  3.     char name[20];    
  4.    printf("\n 输入任意字符 : ");    
  5.    fgets(name, sizeof(name)-1, stdin);//stdin 意思是键盘输入    
  6.    fputs(name, stdout); //stdout 输出   
  7.    return 0;    
  8. }    
#include <stdio.h>  
int main ( ) {  
    char name[20];  
   printf("\n 输入任意字符 : ");  
   fgets(name, sizeof(name)-1, stdin);//stdin 意思是键盘输入  
   fputs(name, stdout); //stdout 输出 
   return 0;  
}  
如果使用fgets()读取某个文件,读取文件的时候bufsize大于该行的字符(不包括换行符‘\n’)总数加2(多出来的两个,一个保存文件本身的'\n'换行,一个保存字符串本身的结束标识'\0'),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值