10

来自GNU C 编程教程

( fgets"file get string") 函数类似于gets 函数。此功能已弃用——这意味着它已过时,强烈建议您不要使用它——因为它很危险。这很危险,因为如果输入数据包含空字符,您无法分辨。fgets除非您知道数据不能包含空值,否则不要使用。不要使用它来读取用户编辑的文件,因为如果用户插入空字符,您应该正确处理它或打印明确的错误消息。如果可以,请始终使用 getlineorgetdelim代替。fgets

我认为fgets函数在遇到\0or时会停止\n;为什么本手册页建议在fgets正确处理输入时空字节是“危险的”?getline此外,和之间有什么区别fgets,该功能在C99或未来的 C 标准中是否fgets真正被视为已弃用?

4

2 回答 2

16

不,fgets实际上并未在 C99 或当前标准 C11 中弃用。但是那个教程的作者是对的,fgets当它遇到 NUL 时不会停止,并且没有报告它读取这样一个字符的机制。

该函数最多 从 指向的流中fgets读取比 指定的字符数少 1 到指向的数组。在换行符(保留)之后或文件结尾之后不会读取其他字符。nstreams

(§7.21.7.2)

GNUgetdelimPOSIX 2008getline已经标准化,因此如果您的目标是 POSIX 平台,那么使用它们可能不是一个坏主意。

编辑我认为面对 NUL 字符绝对没有安全的使用方法fgets,但是 R..(见评论)指出有:

char buf[256];

memset(buf, '\n', sizeof(buf));  // fgets will never write a newline
fgets(buf, sizeof(buf), fp);

现在寻找最后一个非\n字符buf。不过,我实际上并不推荐这个 kludge。

于 2013-05-01T17:30:48.577 回答
7

这只是 GNU 宣传。在任何官方意义上都不会被fgets弃用。gets但是很危险且已弃用。

于 2013-05-01T17:34:43.963 回答