来自The GNU C Programming Tutorial:
fgets
(“文件获取字符串”)函数与gets类似 功能。此函数已弃用 - 这意味着它已过时 强烈建议你不要使用它 - 因为它是 危险的。这很危险,因为如果输入数据包含null 性格,你不能说。除非您知道数据,否则请勿使用fgets
不能包含null。不要用它来读取用户编辑的文件 因为,如果用户插入一个空字符,你应该 正确处理或打印清晰的错误消息。一直用 如果可以,请getline
或getdelim
代替fgets
。
我认为fgets
函数在遇到\0
或\n
时会停止;当fgets
正确处理输入时,为什么这个手册页建议空字节是“危险的”?此外,getline
和fgets
之间的区别是什么, C99 或未来中真正被视为已弃用的fgets
函数C标准?
答案 0 :(得分:12)
不,fgets
在C99或当前标准C11中实际上不被弃用。但该教程的作者是正确的,fgets
在遇到NUL时不会停止,并且没有报告其读取此类字符的机制。
fgets
函数最多读取的数字少于n
指定的字符数 从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);
现在查找\n
中的最后一个非buf
字符。不过,我实际上不会推荐这种kludge。
答案 1 :(得分:5)
这只是GNU宣传。在任何官方意义上都不推荐使用fgets
。 gets
但是很危险并且已被弃用。