没有道歉的gets()

Jen*_*fer -4 c debian gcc

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

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

  • 在某些环境中,以上内容可用于创建漏洞利用程序

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

  • 标头声明已被删除(从stdio.h?)

  • 不建议使用gets()

  • 不推荐使用gets()

但是我还是想用它。可能在标题和目标代码完全消失之前“保存”它们的副本。

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

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

而且,请没有关于我不想使用gets()的讲座。

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

ica*_*rus 5

您对fgets的断言just returns whatever will fit without any indication the string has been truncated显然是错误的。如果输入末尾的字符不是换行符,并且您尚未到达文件末尾,则该字符将被截断。此时,您可以分配更大的缓冲区,将到目前为止的内容复制到其中,然后执行另一个fget。

您似乎想要的是一个读取无限字符串的函数。这意味着它将需要进行内存分配,因此其签名将不同于gets(char *buffer),并且您将需要释放结果。这意味着无论您不想改变多少,都可以选择任意长行。

这与getline函数的功能匹配。

所以更换

  char buffer[128];
  char *input=gets(buffer);
  /* do something with input or buffer */
Run Code Online (Sandbox Code Playgroud)

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

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