gets() 毫无歉意
gets() without apology
我在自己的编程中经常使用 gets() 函数。我知道:
输入的字符串可能溢出分配的space
在某些环境中,以上内容可用于创建漏洞
可以使用 fgets() 代替读取标准输入
header 声明已被删除(来自 stdio.h?)
不推荐使用 gets()
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);
有关详细信息,请参阅手册页。
我在自己的编程中经常使用 gets() 函数。我知道:
输入的字符串可能溢出分配的space
在某些环境中,以上内容可用于创建漏洞
可以使用 fgets() 代替读取标准输入
header 声明已被删除(来自 stdio.h?)
不推荐使用 gets()
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);
有关详细信息,请参阅手册页。