分配

2017-03-04 16 views
0

這是我的理解是FGETS()返回字符串參數輸入,然而,分配

我收到「錯誤:分配給輸入「的char [101時不兼容的類型'','

因此,爲什麼變量'line'被認爲是類型'char [101]'而不是'char *'?

char line[101] = ""; 

while (feof(filePtr) == 0){ 
    line = fgets(line, 101, filePtr); 
    strcpy(strPtr, line); 
} 
+0

,因爲這是它是如何定義的? – StoryTeller

+4

[使用'FEOF()'作爲循環條件不好。(http://stackoverflow.com/questions/5431941/why-is-while-feof-文件總是錯誤的) – MikeCAT

回答

4

有兩點在這裏澄清:

  • 你並不需要得到數組指針fgets()調用的結果。 fgets()的第一個參數是要用於存儲讀取值的數組。您可以創建任何臨時字符指針並將fgets()的結果加入其中。如果該指針的值爲null,則該指針僅用於檢測fgets()錯誤。

  • c中的數組名稱無法賦值。因爲它在某些情況下被視爲指向數組第一個元素的指針,所以可能會被誤解。同樣,編譯器在編譯時知道數組的大小,它使用這些信息。如果使用sizeof(line),則輸出將是101而不是4,這應該是32位機器中的sizeof(any pointer)或64位機器中的8個機器中的情況。

+2

這很棘手,但數組名稱不是指針;它是一個數組的名稱。在許多情況下,它變成了一個指向數組第一個元素的指針,但不是全部('sizeof'是衆所周知的,'_Alignof'不是衆所周知的)。數組名稱(與數組類似的函數參數不同)不是可修改的左值;你不能分配給它。但嚴格來說,這不是因爲它是一個不變的指針,儘管它是中等相似的。 –

+0

@Jonathan Leffler我根據你的評論修改了我的答案。 –

5

長話短說:你不能分配到一個數組,它不是一個修改的左值。您需要定義另一個指針來保存返回值。

why is the variable line considered type char[101] and not type char *

在你的情況,line認爲char [101]類型,它確實如此。 In some of the cases,數組衰減到指向數組中第一個元素的指針,但這並不改變數組變量本身是數組類型的事實。

這就是說,你正在過度使用它。你不需要需要來存儲返回值。你可以檢查它對NULL並完成。無論如何,fgets()將掃描值存儲在line數組中。這就是首先通過line(以及它的大小)。

這就是說,請參閱Why is 「while (!feof (file))」 always wrong?