gets() 毫无歉意

gets() without apology

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

但我还是想用它;也许 "saving" header 和 object 代码的副本,然后才完全消失。

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

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

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

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

您关于 fgets just returns whatever will fit without any indication the string has been truncated 的断言显然是不正确的。如果输入末尾的字符不是换行符并且您还没有到达文件末尾,那么它将被截断。此时您可以分配一个更大的缓冲区,将您目前拥有的内容复制到其中并执行另一个 fgets。

您似乎想要的是一个读取无限字符串的函数。这意味着它将需要进行内存分配,因此它将具有与 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);

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