为什么fgets函数已被弃用?

来自GNU C编程教程 :

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

我认为fgets函数遇到\0\n时会停止; 当fgets应该正确处理输入时,为什么这个手册页建议空字节是“危险的”? 此外, getlinefgets之间的区别是什么,并且在C99或未来的C标准中真正被认为已弃用fgets函数是什么?

不,在C99或当前标准C11中实际上不推荐使用fgets 。 但该教程的作者是正确的, fgets在遇到NUL时不会停止,并且没有报告其读取此类字符的机制。

fgets函数最多只读取一个小于n指定的字符数,该值由stream指向的stream指向s指向的数组。 在换行符(保留)或文件结束后不会读取其他字符。

(§7.21.7.2)

GNU的getdelimgetline已在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是危险的并且已被弃用。