首页 > 解决方案 > C - 将字符添加到字符串的开头

问题描述

我尝试创建一个字符串数组,其中每个元素都是一个字符和一个字符串的串联。

例如:

char base_array[4] = {'A', 'C', 'G', 'T'};

字符 *kmer = "ACGT";

char *edge[4] = {“AACGT”、“CACGT”、“GACGT”、“TACGT”};

我尝试使用此代码,但会产生分段错误。

char** kmer_head_append(const char *kmer, const char *base) {

    int i;
    char **edge = malloc(BASE * sizeof(char *));

    for ( i = 0; i < BASE; i++ ) {
        edge[i] = (char *) malloc((strlen(kmer) + 1) * sizeof(char *));
        strcpy(edge[i], &base[i]);
        *((*(edge + i)) + strlen(&base[i])) = kmer;
        *((*(edge + i)) + strlen(&base[i]) + 1) = '\0';
    }

    return edge;
}

int main(void) {
    
    char base_array[4] = {'A', 'C', 'G', 'T'};
    char **edge = kmer_head_append("ACGT", base_array);
    return 0;
}

编辑:

如果char *kmer = "DEFG"输出是一个数组,其中元素是ADEFG, CDEFG, GDEFGeTDEFG

标签: cstringdynamic-memory-allocation

解决方案


你需要大小charchar **

edge[i] =  malloc((strlen(kmer) + 2)); //2 to hold char + \0

strcpy如果要复制 single ,请勿使用char

    strcpy(edge[i], &base[i]); --> edge[i][0] = base[i];

你正在做指针分配你需要的是strcpy

*((*(edge + i)) + strlen(&base[i])) = kmer; --> strcpy((char *)&edge[i][1], kmer);

删除\0已附加的以下行strcpy

    *((*(edge + i)) + strlen(&base[i]) + 1) = '\0';

或者干脆

   sprintf(edge[i], "%c%s", base[i], kmer);

推荐阅读