首页 > 解决方案 > 如何连接字符串但保留每个单独的空终止符?

问题描述

void printHeader(char *Category_Names)
{
    printf("%s %s %s %s", Category_Names,(char*)Category_Names+15,(char*)Category_Names+30,(char*)Category_Names+45);
}

首先,为了我的问题,我已经简化了这个功能。对于我的班级,我正在阅读一个本质上是成绩册的输入文件,并且我正在创建一个学生及其成绩的链接列表。无论如何,输入文件的顶部包含 4 个由空格分隔的类别。例如,“Quizzes Midterms Homework Final”是有效的。对于这个项目,我们可以假设每个类别最多 15 个字符(如果不计算空终止符,则为 14 个)。这就是我阅读输入的方式。

fscanf(file, "%15s %15s %15s %15[^\n]s%*c", category1, category2, category3, category4);

现在我已经了解了背景,我终于可以问我的问题了。如何连接这些字符串,同时将空终止符保留在结果字符串的中间?显然,根据 printf 调用中的参数使用这些空终止符至关重要。在有人建议我改变这种方法之前,我希望我能做到。这是我的教授提供的,如果由我决定,我肯定会以不同的方式来做。谢谢

标签: cstring

解决方案


测验\0\0\0\0\0\0\0\0期中...

通常,strncat渲染它的语义相当混乱,但这正是它的设计目的;可能的历史'\0'在这种情况下实际上不需要四个,除非在提取字符串时方便,因此还必须设置这些。这可能更容易做到struct { char s0[15], s1[15], s2[15], s3[15]; };,但也许你的教授不喜欢那样做。

#include <stdio.h>  /* printf */
#include <string.h> /* strncpy */

#define LEN 14

static char *str15cpy(char *const s1, const char *const s2) {
    char *const ret = strncpy(s1, s2, LEN);
    s1[LEN] = '\0';
    return ret;
}

int main(void) {
    char multistr[(LEN + 1) * 4];
    char *s0 = multistr, *s1 = multistr + LEN + 1,
        *s2 = multistr + (LEN + 1) * 2, *s3 = multistr + (LEN + 1) * 3;
    size_t i;
    str15cpy(s0, "quizzes");
    str15cpy(s1, "midterms");
    str15cpy(s2, "homework");
    str15cpy(s3, "final");
    /* This is what it looks like in memory. */
    for(i = 0; i < 60; i++)
        { const char a = multistr[i]; printf("%c", a ? a : '0'); }
    fputc('\n', stdout);
    /* Since the strings are '\0' terminated (convenient) already, you can, */
    printf("%s\t%s\t%s\t%s\n", s0, s1, s2, s3);
    return 0;
}

并使用具有固定长度记录的二进制 I/O。


推荐阅读