gets与fgets的区别

原文链接:https://www.runoob.com/cprogramming/c-input-output.html

linux系统下需要这样编译:不支持 gets 与 puts, 需要用 fgets 和 fputs。

将以下代码放到 test.c 文件:

#include <stdio.h>

int main()
{
    char c[100];
    printf("Enter a value:");
    fgets( c,100,stdin );

    printf("\nyou entered:");
    fputs( c,stdout );

    return 0;

}

编译执行以上代码,输出结果为:

# gcc test.c 
# ./a.out 
Enter a value:runoob

you entered:runoob

gets()与fgets()

gets()

gets函数原型:char*gets(char*buffer);//读取字符到数组:gets(str);str为数组名。

gets函数功能:从键盘上输入字符,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。

读取的换行符被转换为null值,做为字符数组的最后一个字符,来结束字符串。

注意:gets函数由于没有指定输入字符大小,所以会无限读取,一旦输入的字符大于数组长度,就会发生内存越界,

从而造成程序崩溃或其他数据的错误。

fgets()

fgets函数原型:char *fgets(char *s, int n, FILE *stream);//我们平时可以这么使用:fgets(str, sizeof(str), stdin);

其中str为数组首地址,sizeof(str)为数组大小,stdin表示我们从键盘输入数据。

fgets函数功能:从文件指针stream中读取字符,存到以s为起始地址的空间里,直到读完N-1个字符,或者读完一行。

注意:调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。

借用教程实例,我把char str[100] 改为 char str[5]

 

#include <stdio.h>

int main( )
{
    char str[5];

    printf( "Enter a value :");
    gets( str );

    printf( "\nYou entered: ");
    puts( str );
    return 0;
}

如果输入123(长度小于5)结果为:

Enter a value :123

You entered: 123

如果输入123456789(长度大于5)结果为:

Enter a value :123456789

You entered: 123456789

虽然正常显示了,但是系统提示程序崩溃了

如果不能正确使用gets()函数,带来的危害是很大的,就如上面我们看到的,输入字符串的长度大于缓冲区长度时,并没有截断,原样输出了读入的字符串,造成程序崩溃。

 

考虑到程序安全性和健壮性,建议用fgets()来代替gets()。如:

 

#include <stdio.h>

int main( )
{
    char str[5];

    printf( "Enter a value :");
    fgets( str,5,stdin );      //fgets()函数;

    printf( "\nYou entered: ");
    puts( str );
    return 0;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值