【问题标题】:How to join char arrays in c如何在c中加入char数组
【发布时间】:2016-11-11 11:32:38
【问题描述】:

所以我有一个具有频道名称的文本文件,格式如下:

General
Private
Programming
Calculus

我想要做的是,如果用户在控制台上写“/channels”,程序应该以这种格式打印所有频道:

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

【问题讨论】:

    标签: c arrays


    【解决方案1】:

    您应该从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 字符串在每个项目之前输出,将其初始化为空字符串并在每个项目之后将其更改为", ",这是一种无需额外测试即可生成连接列表的简单方法。

    【讨论】:

    • 对于separator,这样我们避免了对每个项目的测试,但是我们分配了一个任务,还是更好?
    • 分配通常比测试便宜得多,因为它不会导致分支。不同的处理器表现不同,只有仔细的基准测试才能证明对于给定的处理器和目标环境组合,一种方法比另一种方法更有效。
    【解决方案2】:

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

    您可能希望从fgets 中删除\n - 这样您就可以将printf 几项放在一行中:

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

    【讨论】:

    • 是的,我知道如何删除输入,但我的问题是之后插入逗号。
    • 这会在末尾留下一个多余的逗号。
    • 是的,我知道我可以不用删除回车替换为 char ',' 但是就像你说的那样,它总是在末尾留下一个逗号。
    猜你喜欢
    • 2016-03-07
    • 2011-06-16
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2018-04-07
    相关资源
    最近更新 更多