c:gets()和fputs()是危险的函数?
在学校的计算机实验室,我们使用fputs
编写了一个程序,并且编译器返回了一个错误gets is a dangerous function to use
和fputs
的类似错误
但在家里,当我输入这段代码:
#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
了解决,这真的非常危险。
但问题还提到了fputs
。 fputs
function非常安全; 它没有这些安全问题。
我相信OP可能会错误地暗示编译器警告过`fputs。