C中的gets()字符串函数被认为是一种不好的做法吗?

C中的gets()字符串函数被认为是一种不好的做法吗?,c,gets,C,Gets,在读第一本C语言书的时候,无意中发现作者说这是一个糟糕的做法 gets是一个 已经存在很长时间了。 但你真正需要知道的是 你真的不应该这样吗 使用它 为什么这被认为是一种不好的做法 gets容易发生缓冲区溢出,即内存损坏等 fgets通过传入缓冲区的大小来解决这一问题。gets容易发生缓冲区溢出,即内存损坏等 fgets通过传入缓冲区的大小来实现这一点 #include<stdio.h> int main() { char buffer[100]; gets(buff

在读第一本C语言书的时候,无意中发现作者说这是一个糟糕的做法

gets是一个 已经存在很长时间了。 但你真正需要知道的是 你真的不应该这样吗 使用它

为什么这被认为是一种不好的做法

gets容易发生缓冲区溢出,即内存损坏等

fgets通过传入缓冲区的大小来解决这一问题。gets容易发生缓冲区溢出,即内存损坏等

fgets通过传入缓冲区的大小来实现这一点

#include<stdio.h>
int main()
{
    char buffer[100];
    gets(buffer);
    printf("The input is %s",buffer);
}
当用户输入的长度在99以内时,就没有问题了。但当用户输入超过99个字符时,它会尝试写入它不拥有的内存

最糟糕的是,它会导致异常行为,程序在没有任何信息的情况下终止,这会让用户对当前情况感到困惑

另一种方法是使用char*fgetschar*s、int size、FILE*stream;作用

更新:正如@pmg:gets所指出的,删除新行,而fgets保留新行

#include<stdio.h>
int main()
{
    char buffer[100];
    gets(buffer);
    printf("The input is %s",buffer);
}
当用户输入的长度在99以内时,就没有问题了。但当用户输入超过99个字符时,它会尝试写入它不拥有的内存

最糟糕的是,它会导致异常行为,程序在没有任何信息的情况下终止,这会让用户对当前情况感到困惑

另一种方法是使用char*fgetschar*s、int size、FILE*stream;作用


更新:正如@pmg:gets所指出的那样,当fgets保留新行时,gets删除了新行

gets函数不再是C的一部分。它被删除了,这太可怕了。它是一个不能安全使用的函数,因为它有一个可写入的字符缓冲区,但没有可读取的最大字符数。如果提供的字符太多,最终将导致损坏。决不使用它;更喜欢fgets。@iwillnotexistidnotexist:当已知stdin是完全由您控制的文件时,有一种安全的方法可以使用gets。然而,这种情况是非常不寻常的,我可以说,是人为的,不值得考虑,而且出于实际目的,GET总是不安全的。GET函数不再是C的一部分。它太可怕了,被删除了。它是一个不能安全使用的函数,因为它有一个可写入的字符缓冲区,但没有可读取的最大字符数。如果提供的字符太多,最终将导致损坏。决不使用它;更喜欢fgets。@iwillnotexistidnotexist:当已知stdin是完全由您控制的文件时,有一种安全的方法可以使用gets。然而,这种情况是非常不寻常的,我可以说,人为的不值得考虑,并且出于实际目的,GET总是不安全的。尝试99个非100个空字符谢谢你指出:@KrishnaM这很有帮助谢谢@iwillnotexistidnotexist:删除换行符;保留它。@pmg没有意识到FGET和GET之间的进一步不对称。我会调出我的评论。试试99而不是100个空字符谢谢你指出:@KrishnaM这很有用谢谢@iwillnotexistidnotexist:删除换行符;保留它。@pmg没有意识到FGET和GET之间的进一步不对称。我会收回我的评论。