06 December 2013

最近遇到了一个bug,是因为不了解C语言的fgets函数导致的。这里专门写篇文章说一下新学到的东西。

fgets的介绍可参见这里:http://www.cplusplus.com/reference/cstdio/fgets/

新学到的是其中的这么一句:“If the end-of-file is encountered … before any characters could be read, the pointer returned is a null pointer (and the contents of str remain unchanged)”。

意思是说:如果在读到任何字符之前遇到了EOF(比如读一个空文件时),那么返回空指针,同时传给它的缓冲区内容不会被改变

我之前以为读空文件时缓冲区会被设置为一个空字符串,也就是将缓冲区首地址处设为’\0’。最近发现这种想法是错误的。

另外一点需要注意的是,fgets函数在读到换行符时结束,而且会把换行符附加到字符串的结尾。 从标准输入读取字符串的gets函数虽然也是读到换行符时结束,但它不会把这个换行符附加到字符串的结尾。

最后播报一则新闻:gets已经从最新的C标准中移除了;C++标准也把它标记为了弃用。