debian - gets() 没有道歉

标签 debian c gcc

我在自己的编程中经常使用 gets() 函数。我知道:

  • 输入字符串可能会溢出分配的空间

  • 在某些环境中,上述内容可用于创建漏洞

  • 可以使用 fgets() 来读取标准输入

  • header 声明已被删除(从 stdio.h 中?)

  • 不建议使用 gets()

  • gets() 已被弃用

但我还是想用它;也许在头文件和目标代码完全消失之前“保存”一份副本。

我不喜欢 fgets(),因为如果输入太长,它只会返回适合的内容,而不会显示字符串已被截断。字符串的其余部分(或至少下一部分)将在下一次调用时返回,如果您只是编写一个程序将标准输入复制到标准输出或文件,那么这很好(为什么有人想要编写一个程序)这样做?)但如果您以某种方式处理数据,则毫无用处。

请不要回答这个问题:我如何知道输入字符串已被 fgets() 截断?这不是我要回答的问题。正确的问题是如何在没有大量厄运和灾难警告的情况下使用 gets() ?

请不要讲我如何不想使用 gets()。

我在 Debian 9 下使用 gcc c;没有 IDE。

最佳答案

您关于 fgets 只返回任何适合的内容而没有任何迹象表明字符串已被截断的断言显然是不正确的。如果输入末尾的字符不是换行符并且尚未到达文件末尾,则它将被截断。此时,您可以分配一个更大的缓冲区,将目前拥有的内容复制到其中,然后执行另一个 fget。

您似乎想要的是一个读取无限字符串的函数。这意味着它将需要进行内存分配,因此它将具有与 gets(char *buffer) 不同的签名,并且您将需要释放结果。这意味着,无论您不想对 gets 进行多大的改变,如果您希望能够处理任意长的行,您就别无选择。

这与函数 getline 匹配确实如此。

所以替换

  char buffer[128];
  char *input=gets(buffer);
  /* do something with input or buffer */

  char *input=NULL;
  size_t len=0;
  getline(&input, &len, stdin);
  /* do something with input */
  free(input);

有关更多详细信息,请参阅手册页。

关于debian - gets() 没有道歉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58620783/

相关文章:

linux - 在 debian 8 上配置 openvz

qt - CMake CPack debian 软件包

c - C的多线程性能库?

c - 海湾合作委员会 : Static array index in function argument doesn't trigger any warning

c++ - 如何将 GCC 的 printf 格式属性与 C++11 可变参数模板一起使用?

linux - Plesk 文件管理器错误 "The requested URL/smb/web/file-manager/dir//httpdocs was not found on this server."

shell - 在 Tex 文件中包含日期和时间

C - 在字符串上使用 scanf 获取数字

c - 虽然循环不适用于 C 编程

c - 如何删除警告 : Control reaches end of non-void function?