2013-02-20 56 views
1

我工作的數組是:如何在用fgets()填充字符串數組後刪除換行符「 n」?

char arr[91][12]; 

所以我用填充我的數組從一個文件for循環像這樣:

for(i = 0; fgets(arr[i], 12, inFile); i++){} 

當我想從陣列打印任何東西,它是自動轉到下一行。

來測試數組:

for(i = 0; fgets(arr[i], 12, inFile); i++){ 
    printf("%s", arr[i]); 
} 

//one 
//two 
//three etc. 

//want it to be 'one two three etc.' 

我試圖用strpbrk()找到\n數組中的每個字符串,並更改爲\0這樣的:

for(i = 0; fgets(arr[i], 12, inFile); i++){ 
if(strpbrk(arr[i], "\n") != NULL){ 
    arr[i][strpbrk(arr[i], "\n")] = '\0'; 
    } 
printf("%s", arr[i]); 
} 

但是這給我的錯誤。有沒有更好的方式來做我想做的事情?

+5

「給我錯誤」是* not *對於開發人員來說是適當的問題描述。 – 2013-02-20 02:13:27

+0

這是爲了簡單起見。 – nzondlo 2013-02-20 03:12:07

回答

5

它實際上比你似乎認爲要簡單得多。如果換行是在結束(因爲它與fgets讀取時)剛剛過去的字符更改爲一個字符串結束:

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

-1是因爲陣列(比如字符串可以被認爲是)開始自己的索引在零並且去到length - 1


要確保你真的一個換行符,可以使用例如strpbrk像你一樣(但當然不像你在其他答案中解釋的那樣做)。但我認爲使用strrchr會更好。首先,因爲它更簡單(只搜索字符不是字符串),其次是因爲它開始從終端搜索:

char *newlineptr = strrchr(arr[i], '\n'); 
if (newlineptr != NULL) 
    *newlineptr = '\0'; 

或全部以最快的方式:

size_t length = strlen(arr[i]); 
if (arr[i][length - 1] == '\n') 
    arr[i][length - 1] = '\0'; 
+2

+1。如果它返回讀取的字符數而不是'NULL'或你給它的緩衝區,我認爲'fgets'會更好。 – dreamlax 2013-02-20 02:20:38

+0

@dreamlax:毫無疑問。 POSIX 2008 ['getline()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html)提供了長度作爲返回值,或-1(有趣的是,它被記錄爲 - 1,而不是EOF)錯誤或EOF。 – 2013-02-20 04:19:29

3

strpbrk返回指針'\n'。所以改變:

arr[i][strpbrk(arr[i], "\n")] = '\0'; 

到:

*strpbrk(arr[i], "\n") = '\0'; 
+0

'strpbrk'雖然可以返回'NULL',但如果行太大而無法放入提供給'fgets()'的緩衝區,就會發生這種情況,所以最好先檢查'NULL'。 – dreamlax 2013-02-20 02:18:25

+0

@dreamlax:正確的建議,OP的代碼*會*檢查NULL。 – 2013-02-20 02:19:45

+0

是的,你是 – dreamlax 2013-02-20 02:22:06

4

strpbrk()返回一個指針到換行,所以你應該只用一次:

char *nl; 

if ((nl = strpbrk(arr[i], "\n")) != NULL) 
    *nl = '\0'; 

或者,newli NE將字符串中的最後一個字符,所以這個工程太:

size_t len = strlen(arr[i]); 
if (arr[i][len-1] == '\n') 
    arr[i][--len] = '\0'; 

注意這個檢查是否你有一個換行; fgets()停止讀取時,除NUL '\0'之外的空間用完,即使尚未讀取換行符。 這也給你的字符串的長度(間接地strpbrk()也是如此;它是nl - arr[i] - 1)。請注意,strpbrk()及其相對的strcspn()strlen()更復雜。