2012-10-21 22 views
2

我已經寫了一個函數來包裝GNU getline()並刪除尾隨的換行符,但由於某種原因它沒有效果。難道我做錯了什麼?刪除換行符的函數沒有作用?

ssize_t readline(char **lineptr, FILE *stream) 
{ 
    size_t len = 0; // Size of the buffer, ignored. 

    ssize_t chars = getline(lineptr, &len, stream); 

    if((*lineptr)[chars] == '\n') { 
    (*lineptr)[chars] = '\0'; 
    --chars; 
    } 

    return chars; 
} 

它編譯和鏈接沒有問題,但換行符不被替換爲空終止符。我已驗證if()語句正在運行。謝謝你的幫助!

+0

剛剛用這個去除了那個換行符, g_strchomp(line) – TechZilla

回答

9

getline返回的字符讀數。所以你必須使用chars-1而不是char

if ((*lineptr)[chars - 1] == '\n') 
    { 
     (*lineptr)[chars - 1] = '\0'; 
     --chars; 
    } 

男人函數getline(3)

成功時,getline()getdelim()返回字符數讀,包括:>分界符,但不包括 終止空字節。該值可用於處理讀取行中的嵌入式空字節 。

+0

就是這樣,謝謝! – James

4

你想檢查並替換最後一個字符,而不是之後的那個

if ((*lineptr)[chars - 1] == '\n') { 
    (*lineptr)[chars - 1] = '\0'; 
} 

getline()返回字符數讀,只是作爲一個字符串的strlen()返回的長度,不包括終止0字符。)

+0

輝煌,解決了它!多麼愚蠢的錯誤。 – James

+0

@詹姆斯沒問題。請注意/接受(當你可以這樣做時)。 – 2012-10-21 17:07:27