if ( fgets( line, sizeof(line), stdin ) == (char*) 0 )...
我不明白这行代码的作用,有人知道吗?
这是一种非常奇怪的编写方式,用于测试 fgets()
返回空指针表示错误的情况。
我会这样写:
if (!fgets(line, sizeof(line), stdin))
NULL
进行比较,因为这符合函数的语义(它不返回布尔值)。 - Oliver Charlesworth(char*) 0
这不是一个空字符,而是指向地址0处的字符指针。
一个包含值0的字符将会是:
(char) 0
(char *)1
代表什么意思? - compile-fan这意味着一个指向char类型的空指针。如果你将(char*)0替换为NULL,结果将是相同的。在这种情况下,它检查stdin中是否没有更多可读取的内容。我认为这只是一种神秘而炫酷的展示方式,展示了一些美丽而壮观的特性。如果你使用NULL代替它,可以提高可读性,而不会改变语义。
fgets
是否返回 0。将其转换为 char*
类型只是为了匹配 fgets
的返回类型。char * fgets ( char * str, int num, FILE * stream );
但是如果你删除它,0会被隐式转换为char*
。
如果您需要更多关于fgets
的信息,请查看这里。
(char*)0 创建了“null”指针。因此,您正在检查 fgets 的值是否为空。
fgets 的文档声明,当出现错误或达到文件结尾时,它返回 null 。
完整语句似乎是在检查是否已到达文件末尾,如果是,则中止(虽然这只是猜测)。
这只是检查fgets的结果是否为null字符指针。
返回值
成功时,该函数返回相同的str参数。如果遇到文件结束符并且没有读取任何字符,则str的内容保持不变,并返回空指针。
如果发生错误,则返回空指针。
使用ferror或feof之一来检查是否发生错误或已达到文件结束符。
char* line;
并且分配给它的空间小于sizeof(char*)时,才会出现UB。 - R. Martinho Fernandes