c:gets()和fputs()是危险的函数?

在学校的计算机实验室,我们使用fputs编写了一个程序,并且编译器返回了一个错误gets is a dangerous function to usefputs的类似错误

但在家里,当我输入这段代码:

 #include  main() { FILE *fp; char name[20]; fp = fopen("name.txt","w"); gets(name); fputs(name,fp); fclose(fp); } 

我什么都没有得到任何错误。 在学校的那个与这个相似,只是有点冗长而且有更多的变数。
我在家里使用codeblocks,在学校使用fedora提供的默认gcc。
这可能是编译器的问题吗?

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

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

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

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

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

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

fputs很好,完全没有危险。

请参阅此处了解强大的用户输入函数,使用fgets ,可用于防止缓冲区溢出。

它只是不同编译器的不同设置。 也许Codeblocks使用的编译器并不详细或关闭警告。

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

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

其他答案都gets了解决,这真的非常危险。

但问题还提到了fputsfputsfunction非常安全; 它没有这些安全问题。

我相信OP可能会错误地暗示编译器警告过`fputs。