Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c:get()和fputs()是危险的函数吗?_C_Gcc_Gets_Fputs - Fatal编程技术网

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

c:get()和fputs()是危险的函数吗?,c,gcc,gets,fputs,C,Gcc,Gets,Fputs,在学校的计算机实验室里,我们使用fputs编写了一个程序,编译器返回了一个错误get使用是一个危险的函数,对于fputs 但在家里,当我输入这段代码时: #include <stdio.h> main() { FILE *fp; char name[20]; fp = fopen("name.txt","w"); gets(name); fputs(name,fp); fclose(fp); } #包括 main() { 文件*fp

在学校的计算机实验室里,我们使用
fputs
编写了一个程序,编译器返回了一个错误
get使用是一个危险的函数
,对于
fputs

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

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

    fputs(name,fp);
    fclose(fp);
}
#包括
main()
{
文件*fp;
字符名[20];
fp=fopen(“name.txt”,“w”);
获取(名称);
FPUT(名称,fp);
fclose(fp);
}
我从来没有犯过这样的错误。学校里的那本书和这本书很相似,只是有点长,而且有更多的变量。
我在家使用代码块,在学校使用fedora提供的默认gcc。

这可能是编译器的问题吗?

gets
肯定是危险的,因为无法防止缓冲区溢出

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

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

fputs
很好,一点也不危险


有关强大的用户输入功能,请参阅,使用
fgets
,该功能可用于防止缓冲区溢出。

gets
无疑是危险的,因为无法防止缓冲区溢出

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

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

fputs
很好,一点也不危险


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

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

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


您不会得到任何错误,因为您分配的缓冲区
name
很可能足够大,可以容纳文件
name.txt
的内容,但如果不是这样,则会出现问题,因此编译器会发出警告。

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

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


您不会收到任何错误,因为很可能您分配的缓冲区
name
足够大,可以容纳文件
name.txt
的内容,但如果不是这样,则会出现问题,因此编译器会发出警告。

这只是不同编译器的不同设置。可能代码块使用的编译器没有那么详细,或者关闭了警告


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

这只是不同编译器的不同设置。可能代码块使用的编译器没有那么详细,或者关闭了警告


不管使用哪种编译器,它们都是危险的函数,因为它们不检查缓冲区溢出。改用fgets或fput。

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

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

其他答案都提到了
get
,这确实非常危险

但是这个问题也提到了fputs。
fputs
功能非常安全;它没有这种安全顾虑


我相信OP可能是错误的,因为它暗示编译器已经警告了'fput.

其他答案都提到了
get
,这确实非常危险

但是这个问题也提到了fputs。
fputs
功能非常安全;它没有这种安全顾虑


我相信OP可能是错误的,因为它暗示编译器已经警告过'fputs.

这可能是重复的,这就是为什么家庭比学校好:)学校的实验室环境可能已经配置好,以便GCC编译时的警告级别高于您的设置。在任何情况下,最好注意这个警告。当你是新手时,Twxo的重要经验法则是:相信编译器(这很少是错误的!),并要求它给出所有警告(使用
gcc-Wall
)。大多数真正的程序员改进他们的代码,直到没有警告为止。@BasileStarynkevitch,我真的很喜欢f