1

在学校的计算机实验室中,我们编写了一个程序 ,当我在家里输入这段代码时fputs,编译器返回了一个错误gets is a dangerous function to use和类似的错误:fputs

#include <stdio.h>
main()
{
    FILE *fp;
    char name[20];
    fp = fopen("name.txt","w");
    gets(name);

    fputs(name,fp);
    fclose(fp);
}

我没有任何错误。学校的那个和这个差不多,只是有点冗长,变量更多。
我在家里使用代码块,在学校使用 Fedora 提供的默认 gcc。
会不会是编译器的问题?

4

5 回答 5

2

您需要确切地知道您将gets读取多少个字符,并相应地使用足够大的缓冲区。如果您使用的缓冲区小于您读取的文件内容,您最终会写入超出分配缓冲区的范围,这会导致未定义行为和无效程序。

相反,您应该使用fgetswhich 允许您指定要读取的数据量。

您不会收到任何错误,因为您分配的缓冲区很可能name足以容纳文件的内容,name.txt但如果不是,那么它就是一个问题,因此编译器会发出警告。

于 2012-01-19T06:19:27.917 回答
1

gets肯定很危险,因为没有办法防止缓冲区溢出。

例如,如果您的用户输入了 150 个字符,那几乎肯定会给您的程序带来问题。对于您无法控制的输入,也应避免使用scanf无界格式说明符。"%s"

但是,使用 不应该gets是一个错误,因为它符合标准。最多,它应该是一个警告(除非您作为开发人员,配置类似“将警告视为错误”之类的东西)。

fputs很好,一点都不危险。

请参阅此处了解强大的用户输入功能 using fgets,该功能可用于防止缓冲区溢出。

于 2012-01-19T06:19:26.783 回答
1

这只是不同编译器的不同设置。也许 Codeblocks 使用的编译器没有那么冗长或关闭了警告。

无论使用哪种编译器,它们都是危险的函数,因为它们没有检查缓冲区溢出。请改用 fgets 或 fputs。

于 2012-01-19T06:20:09.990 回答
0

至于问题,任何编译器都没有任何问题。如果您查看 Timothy Jones 提供的链接,您就会明白为什么会发出此警告。对于不同版本的编译器,编译器配置不同,发出不同级别的警告。

于 2012-01-19T06:21:08.073 回答
0

其他答案都已解决gets,这确实非常危险。

但问题也提到了fputs。该fputs功能非常安全;它没有这些安全问题。

我相信 OP 可能错误地暗示编译器已经警告过 `fputs.

于 2018-03-17T09:01:25.090 回答