fgetc()和fgets()之间的区别?

Old*_*ool 1 c file

我知道这样fgetc()一个事实,即一次从一个FILE用作参数的指针所指向的文件中读取一个字符.

fgets()将读取整个字符串达到参数列表中指定的大小但是当行结束时fgetc()返回EOF而fgets()返回NULL.so为什么要记住两个令人困惑的事情?

das*_*ght 9

一个返回EOF而另一个返回的原因NULL是两个函数的返回类型的差异:一个返回一个int,而另一个返回一个char*.

当到达输入结束时,两个函数都需要返回"特殊"值."特殊"是指一种不能合法出现在输入中的值.对于指针,大多数情况下的特殊值是NULL,因此fgets返回.但是,您不能NULL用来标记输入的结尾fgetc,因为零字符代码可以合法地出现在输入中.这就是为什么EOF在返回单个字符的I/O函数中用作"特殊值"的原因.


unw*_*ind 1

当然,你必须询问 C 标准库的原始设计者,不确定他们中是否有人。

在我看来,许多接受字符串缓冲区的标准函数都会返回相同的缓冲区,因此从这个角度来看,fgets()行为是完全规则且可预测的。

如果您不害怕NULL,它返回指针的事实意味着该函数可以被链接:

char buf[128];
printf("you said '%s'\n", fgets(buf, sizeof buf, stdin));
Run Code Online (Sandbox Code Playgroud)

如果fgets()失败,上面的内容是未定义的,但是换成printf()具有明确定义处理的东西NULL,你就会明白我的观点。

fgetc()当然,返回指针是没有意义的,因为它的级别更低,它只需要返回单个字符 或EOF,这int是 的标准类型。