【问题标题】:Is the gets() string function in C considered a bad practice? [duplicate]C 中的 gets() 字符串函数是否被认为是一种不好的做法? [复制]
【发布时间】:2014-04-20 14:55:24
【问题描述】:

正在阅读 Head first C 书,偶然发现作者说 gets() 是一种不好的做法

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

为什么它被认为是不好的做法?

【问题讨论】:

  • gets 函数不再是 C 的一部分。太糟糕了,它被删除了。
  • 这是一个安全使用 CANNOT 的函数,因为它有一个要写入的字符缓冲区,但没有最大字符数读。如果您提供太多字符,最终会导致损坏。绝不使用它;首选fgets()
  • @IwillnotexistIdonotexist:当stdin 是一个完全受您控制的文件时,有一种使用gets 的安全方法。然而,这种情况非常不寻常(并且,我可能会说,人为的)不值得考虑,并且出于实际目的gets总是不安全。

标签: c gets


【解决方案1】:

考虑

#include<stdio.h>
int main()
{
    char buffer[100];
    gets(buffer);
    printf("The input is %s",buffer);
}

当用户输入长度在 99 以内的输入时,没有问题。但是当用户输入超过 99 个字符时,它会尝试写入不属于它的内存。

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

另一种方法是使用char *fgets(char *s, int size, FILE *stream); 函数

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

【讨论】:

  • 尝试 99 而不是 100(空字符)
  • 感谢您指出:)
  • @KrishnaM 很有帮助,谢谢!
  • @IwillnotexistIdonotexist: gets() 删除换行符; fgets() 保留它。
  • @pmg 不知道fgets()gets() 之间的这种进一步不对称。我会撤回我的评论。
【解决方案2】:

gets 容易出现缓冲区溢出(即内存损坏等)。

fgets 通过传入缓冲区的大小来解决这个问题

【讨论】:

    猜你喜欢
    • 2015-10-29
    • 2017-07-28
    • 2018-08-11
    • 2015-07-24
    • 2012-01-08
    • 2015-07-20
    • 1970-01-01
    • 2022-01-09
    • 2010-10-15
    相关资源
    最近更新 更多