2015-12-31 67 views
0

我想修剪fgets輸出中的換行符。如何在fgets()輸出結尾修剪' n'

while(fgets(buff,1024,fp)){ 

    printf("start%send",buff); 

如果在文件中有一行「C is cool」。然後打印上面的代碼。

startC is cool 
end 

但我想它打印像

startC is coolend 

如何做到這一點

+0

髒方法'的buff [strlen的(淺黃色)-1] = 0;' –

+0

@Lashane:在沒有輸入(EOF)和'strlen(buff)'爲0的情況下,這是危險的。 –

回答

6

清潔方法

#include <string.h> 

//... 

buff [ strcspn(buff, "\r\n") ] = 0; 

這將安全工作作爲行結束的任何味道,甚至如果沒有,則即使該字符串爲空。

+0

不錯的做法,但評論是誤導和違背了答案的其餘部分。 –

+0

@R ..謝謝,但你能解釋一下你對我評論的評論嗎? –

+0

評論說*拖尾*新行,但是你的代碼實際上做的是在第一個換行符(或回車)字符處截斷字符串。 'fgets'不能產生一個換行符,除了後面的換行符,但是可以有大量的嵌入式回車符。 –

2

您可以將最後一個字符設置爲'\0'(空終止符)。這不是一個好方法,因爲該文件可能並不總是有換行符。

buff[strlen(buff) - 1] = '\0'; 

或環在字符數組結束更換'\n''\0'

int i; 
for(i = 0; i < strlen(buff); i++) 
{ 
    if(buff[i] == '\n') 
    { 
     buff[i] = '\0'; 
     break; 
    } 
} 

或在與strcspn()末端拆卸'\n'

buff[strcspn(buff, "\r\n")] = 0; 
+0

從文件讀取的最後一行可能沒有'newline',在這種情況下,您的第一個示例很弱。 'newline'不是由'fgets'添加的,它是文件中的內容。 –

+0

的確,我只是把它包括在內,因爲這是一種適用於這個問題的方法。我會編輯以澄清這不是一個好方法。 –

+0

如果'strlen(buff)'爲0,則會產生危險的未定義行爲。 –