为什么fgets函数已被弃用?

时间:2013-05-01 17:28:23

标签: c file-io gnu c99 buffer-overflow

来自The GNU C Programming Tutorial

  

fgets(“文件获取字符串”)函数与gets类似   功能。此函数已弃用 - 这意味着它已过时   强烈建议你不要使用它 - 因为它是   危险的。这很危险,因为如果输入数据包含null   性格,你不能说。除非您知道数据,否则请勿使用fgets   不能包含null。不要用它来读取用户编辑的文件   因为,如果用户插入一个空字符,你应该   正确处理或打印清晰的错误消息。一直用   如果可以,请getlinegetdelim代替fgets

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

2 个答案:

答案 0 :(得分:12)

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

  

fgets函数最多读取的数字少于n指定的字符数   从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);

现在查找\n中的最后一个非buf字符。不过,我实际上不会推荐这种kludge。

答案 1 :(得分:5)

这只是GNU宣传。在任何官方意义上都不推荐使用fgetsgets但是很危险并且已被弃用。