如何在c中连接char数组

时间:2016-11-11 11:32:38

标签: c arrays

所以我有一个文本文件,其中包含频道名称,格式为:

General
Private
Programming
Calculus

我尝试做的是用户是否写了“#' / channel'在控制台上程序应该以这种格式打印所有通道:

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);
}

2 个答案:

答案 0 :(得分: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也不会以换行符结束。剥离最后一个字符也是不正确的,但上面的代码仍然错误地处理了这种情况,因为这样的行将被分成2个项目。使缓冲区更大是一个简单的解决方案。
  • 在每个项目之前输出separator字符串,将其初始化为空字符串,并在每个项目是一个简单的方法之后将其更改为", ",以生成没有额外测试的连接列表。

答案 1 :(得分:1)

  

我的问题是以这种格式打印频道,用逗号分隔它们。

您可能希望从\n移除fgets - 这样您就可以在一行中printf多个项目:

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