为什么fgets函数已被弃用?
来自GNU C编程教程 :
fgets
(“file get string”)函数类似于gets函数。 这个函数已被弃用 – 这意味着它已经过时,强烈建议您不要使用它 – 因为它很危险。 这很危险,因为如果输入数据包含空字符,则无法分辨。 除非您知道数据不能包含null,否则不要使用fgets
。 不要使用它来读取用户编辑的文件,因为如果用户插入空字符,您应该正确处理它或打印清晰的错误消息。 如果可以,请始终使用getline
或getdelim
而不是fgets
。
我认为fgets
函数遇到\0
或\n
时会停止; 当fgets
应该正确处理输入时,为什么这个手册页建议空字节是“危险的”? 此外, getline
和fgets
之间的区别是什么,并且在C99或未来的C标准中真正被认为已弃用的fgets
函数是什么?
不,在C99或当前标准C11中实际上不推荐使用fgets
。 但该教程的作者是正确的, fgets
在遇到NUL时不会停止,并且没有报告其读取此类字符的机制。
fgets
函数最多只读取一个小于n
指定的字符数,该值由stream指向的stream
指向s
指向的数组。 在换行符(保留)或文件结束后不会读取其他字符。
(§7.21.7.2)
GNU的getdelim
和getline
已在POSIX 2008中标准化,因此如果您的目标是POSIX平台,那么使用它们可能并不是一个坏主意。
编辑我认为在面对NUL角色时绝对没有安全的方法来使用fgets
,但R ..(见评论)指出:
char buf[256]; memset(buf, '\n', sizeof(buf)); // fgets will never write a newline fgets(buf, sizeof(buf), fp);
现在在buf
查找最后一个非\n
字符。 不过,我实际上不会推荐这种kludge。
这只是GNU的宣传。 从官方意义上讲, fgets
已被弃用。 然而, gets
是危险的并且已被弃用。