2016-11-11 52 views
3

,所以我必須擁有渠道的名稱的文本文件,格式如下:如何加入字符數組在C

General 
Private 
Programming 
Calculus 

而我正在試圖做的是,如果用戶寫了「/渠道「控制檯上的程序應該打印在這種格式的所有通道:

Channels are : General, Private, Programming, Calculus 

我的問題是印刷在這種格式的渠道,用逗號分隔。使用我現在可以打印的通道,但是它們以文本文件中的格式打印(每行一個通道名稱)。如果有人能夠向我解釋做這件事的最佳方式是什麼,我會非常感激。下面是代碼我現在有打印頻道:

void get_channels() { 
    char tmp[50]; 
    FILE *f; 
    f = fopen("../1part/channels.txt", "r"); 
    if (f == NULL) { perror("Mistake reading: "); exit(1); } ; 
    while (fgets(tmp, sizeof(tmp), f)) { 
     printf("%s", tmp); 
    } 

    fclose(f); 
} 

回答

3

你應該剝去由fgets()讀取的行結尾的換行。

void get_channels(void) { 
    char tmp[50]; 
    FILE *f; 
    const char *separator = ""; 

    f = fopen("../1part/channels.txt", "r"); 
    if (f == NULL) { 
     perror("Mistake reading: "); 
     exit(1); 
    } 
    printf("Channels are: "); 
    while (fgets(tmp, sizeof(tmp), f)) { 
     /* strip the newline character if present */ 
     tmp[strcspn(tmp, "\n")] = '\0'; 
     printf("%s%s", separator, tmp); 
     separator = ", "; 
    } 
    printf("\n"); 

    fclose(f); 
} 

注:

  • 如果文件不以回車結束,除去該行的最後一個字符將無法正常工作。
  • 如果文件中的一行超過49個字符,則tmp也不會以換行結束。剝離最後一個字符也是不正確的,但是上面的代碼仍然會錯誤地處理這種情況,因爲這樣的一行會被分成兩個項目。增大緩衝區是一個簡單的解決方案。
  • separator在每個項目之前輸出字符串,將其初始化爲空字符串,並在每個項目之後將其更改爲", ",這是在沒有額外測試的情況下生成聯合列表的簡單方法。
+0

對於這種'分隔符',我們避免了每個項目的測試,但我們是一個任務,反正更好? – aurox

+0

任務通常比測試便宜很多,因爲它不會導致分支。不同的處理器的行爲有所不同,只有仔細的基準測試才能證明一種方法比另一種處理器和目標環境組合的效率更高。 – chqrlie

1

我的問題是打印通道以這種格式,用逗號分隔。

您可能希望從fgets刪除\n - 這樣你可以在一行printf幾項:

while (fgets(tmp, sizeof(tmp), f)) 
{ 
    tmp[strlen(tmp) - 1] = '\0'; // remove \n 
    printf("%s, ", tmp); 
} 
+0

是的,我知道如何刪除輸入,但我的問題是插入逗號後。 – GamerGirl

+0

這會在最後留下多餘的逗號。 – Groo

+0

是的,我知道我可以而不是刪除輸入替換char','但是像你說的那樣,它總是在最後留下一個逗號。 – GamerGirl

相關問題