gets与fgets的区别

    xiaoxiao2025-02-15  32

    原文链接: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)