2014-09-23 101 views
0

我知道以下警告是我的錯,但我需要一些幫助來確定我做錯了什麼。我越來越:「通過從兼容的指針類型‘函數getline’的參數1」,併爲論證2.從不兼容指針類型傳遞getline()的參數

這裏同樣的事情,是我調用函數getline():

getline(&line.buf, &maxSz, stdin) 

這裏有相關參數聲明:

line_t line; 
int maxSz = 1000; 

typedef struct line_t { 
    char buf[1000]; 
    int lineLength; 
    int wordCount; 
    int index; 
} line_t; 

我認爲這個問題是我是牛逼提出了什麼是指針的地址,但在測試了一些不同的getline調用時,我還沒有找到解決方案。我絕對認爲參數2是maxSz不是指針的事實。

while (-1 != (line.lineLength = getline((char**) &line.buf, &maxSz, stdin))) { 
     printf("buf is %s\n",line.buf); 

爲什麼上述給我一個無限循環?

回答

0

關於使用第二個參數的問題:要傳遞到getline()&maxSzint *類型,但功能getline()預計size_t *類型的第二個參數。 聲明

int maxSz = 1000; 

更改爲

size_t maxSz = 1000; 

關於第一agrument:我建議你通過char * buf;更換char buf[1000];。當你不知道它的長度時,閱讀線條是更好的方法。但不要忘記初始化它(即在致電getline()之前添加buf = 0;)。如果您閱讀getline()函數的說明,您會發現,第二個參數未輸入。您的maxSz不限制字符串的最大長度(在此變量中,您可以找到讀取的字符數,包括分隔符字符,但不包括終止空字節('\ 0'))。嘗試編譯並分析typical example

+0

非常感謝。這解決了爭議2.我會有一個谷歌,以確保我理解size_t正確。你知道如何解決爭論1? – user4062632 2014-09-23 03:58:16

+0

非常感謝。那擺脫了它!如果我後來想打印line.buf(僅供參考,我希望這將是stdin的整行),我使用什麼格式描述符?我一直在嘗試%s,但是這給了我以下信息:「format'%s'期望類型'char *',但參數2的類型爲'char(*)[1000]'」 – user4062632 2014-09-23 04:06:05

+0

非常感謝。這絕對是驚人的。我可以再問一件事嗎?我編輯了這個問題,在底部添加了一些代碼。它堅持一遍又一遍地打印相同的行。你能幫我弄明白這是爲什麼嗎? – user4062632 2014-09-23 04:23:17

-1

試試這個:

getline(&line.buf, &sizeof(maxSz), stdin) 
+1

這給了我:「錯誤:第一個參數需要作爲一元運算符的'lvalue'和'操作數',第一個」將'getline'的參數1從不兼容的指針類型傳遞給第一個參數「,但是謝謝您的建議 – user4062632 2014-09-23 04:01:22

0

你會更好使用fgets代替getline,例如

while (fgets(line.buf, maxSz, stdin) != NULL) 
{ 
    // do something with the line 
} 
+0

有什麼區別fgets和getline之間?我一直在使用getline,因爲後來我引用了行長(我可以很容易地從getline中獲得),並發現用fgets實現同樣的事情很困難 – user4062632 2014-09-23 04:03:05

+0

@ user4062632 - getline指望一個指向焦炭。你的代碼沒有被設置爲這樣做。要找到這一行的長度,你需要'line.lineLength = strlen(line.buf);' – user3386109 2014-09-23 04:07:35

+0

雖然line.lineLength只給我1000,因爲我已經將line.buf的大小設置爲1000? – user4062632 2014-09-23 04:09:15

相關問題