2011-05-20 234 views
4
if (fgets(line, sizeof(line), stdin) == (char*) 0)... 

我不明白这条线是干什么的,任何人都知道?c中的(char *)0是什么意思?

+0

你难道不明白哪些部分呢? – crazyscot 2011-05-20 13:53:32

+1

@Martinho:你可以扩展一下吗? – 2011-05-20 13:55:41

+0

@Martinho:是的,的确如此。当然,如果'line'是一个实际的数组类型,它就可以工作。 – 2011-05-20 13:59:47

回答

3
(char*) 0 

不是空字符,而是指向地址为0的字符的指针。

一个包含值0将字符:

(char) 0 
+0

但'(char *)0'与'0'相同,对吗? – 2011-05-20 14:01:42

+1

它不是指向字符@地址0的指针,它是指向空字符的指针(http://www.lysator.liu.se/c/c-faq/c-1.html) – KevinDTimm 2011-05-20 14:07:56

+0

@KevinDTimm char * c = (char *)0指向0,无论哪个值都可能存在(尽管它在大多数平台上都不重要,它会成为非法内存)。 – Hyperboreus 2011-05-20 14:10:27

2

这意味着一个空指针字符。如果用NULL替换(char *)0,它将是相同的。在这个特定的情况下,它正在检查是否没有更多的东西从标准输入读取。我认为这只是一种神秘的方式,展现出一些壮观而美丽的特征。如果将它替换为NULL,则可以在不改变语义的情况下获得可读性。

+0

实际上,它意味着一个指向空字符的指针 - 有区别 – KevinDTimm 2011-05-20 14:05:18

+1

@Kevin实际上,它没有。 fgets()返回一个可能为NULL的指针。所以这段代码只是将结果与NULL进行比较的一种奇怪的方式,它与nul字符无关。 – Lundin 2011-05-20 14:13:43

+0

忽略fgets(),恕我直言(char *)0表示 - 指向空字符的指针,或者char指针指向null,但不指向char指针的空指针 - 它似乎只是语义,但我相信是有区别的。 – KevinDTimm 2011-05-20 14:18:24

1

线检查,如果fgets返回0。投地char*仅仅是匹配的fgets返回类型:

char * fgets (char * str, int num, FILE * stream); 

但0是隐式转换为char*,如果你删除它。

如果您需要更多的信息,fgetshere

-1

很简单,就是检查与fgets为空字符指针的结果。

根据cplusplus.com

返回值

成功时, 返回相同的STR参数的功能。如果遇到 文件结尾,并且没有读取 个字符,则str的 内容保持不变,并返回空指针 。

如果发生错误 ,则返回空指针。

使用ferror或feof检查 是否发生错误或者是否已达到 文件结尾。

4

这是一个非常奇怪的方式来编写一个空指针的返回测试,它指示fgets()中的错误。

我会写这样的:

if (!fgets(line, sizeof(line), stdin)) 
+4

这就是个人品味。我个人的口味总是与'NULL'比较,因为它遵循函数的语义(它不返回布尔值)。 – 2011-05-20 14:01:35

+0

我同意Oli的观点,并且这种观点也被广泛认可的MISRA-C标准所共享。只有布尔表达式应与布尔运算符进行比较。 – Lundin 2011-05-20 14:10:52

+0

@Oli @Lundin我的感觉是,你不能在母猪的耳朵上制作一个丝质的钱包,而且尝试一点也不麻烦。 – 2011-05-20 14:45:26

1

(字符*)0创建 “空” 指针。所以你看到fgets的值是否为空。

fgets的文档指出,如果出现错误或者文件已到达文件结尾,它将返回null。

完整的语句似乎是检查,如果你在文件的末尾,如果是这样爆发(尽管这是一个猜测)。