我知道fgetc()
会从由参数指定的FILE
指针所指向的文件中读取一个字符。
fgets()
会在参数列表中指定的大小范围内读取整个字符串,但是当遇到行尾时,fgetc()
返回EOF,而fgets()
返回NULL
。那么为什么有两个让人困惑的事情要记住呢?
EOF
,另一个函数返回NULL
的原因是两个函数的返回类型不同:一个返回int
,而另一个返回char*
。NULL
,因此这就是fgets
返回的值。但是,你不能使用NULL
来标记fgetc
的输入结束,因为零字符的字符码可以合法地出现在输入中,这就是为什么在返回单个字符的I/O函数中使用EOF
作为“特殊值”的原因。creat()
(没有e,为什么?),strtok()
(默认情况下不安全!),sprintf()
(如果没有可能的缓冲区溢出,你很少会使用它,否则它就像一个过大的锤子),atoi()
(几乎不可能正确检查错误),等等!当然,您需要向C标准库的原始设计者询问,不确定他们是否还在。
在我看来,许多接受字符串缓冲区的标准函数返回相同的缓冲区,因此从这个角度来看,fgets()
的行为是完全规律和可预测的。
如果您不害怕NULL
,那么它返回指针意味着该函数可以链接:
char buf[128];
printf("you said '%s'\n", fgets(buf, sizeof buf, stdin));
fgets()
失败时是未定义的,但如果用一些对 NULL
有明确定义处理方式的东西来替换 printf()
,你就能理解我的意思了。fgetc()
返回指针是没有意义的,因为它更低级,只需要返回单个字符或 EOF
,而 int
是标准类型。
fgetc()
将返回EOF吗? - anatolyg