2011-05-20 253 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。

完整的語句似乎是檢查,如果你在文件的末尾,如果是這樣爆發(儘管這是一個猜測)。