我尝试创建一个字符串数组,其中每个元素是char和字符串的串联。
例如:
char base_array [4] = {'A','C','G','T'};
char * 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
,GDEFG
e TDEFG
你需要char
而不是char **
的大小
edge[i] = malloc((strlen(kmer) + 2)); //2 to hold char + \0
如果你想复制单个strcpy
,请不要使用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);
您可以使用valgrind查看您的段错误。
char **edge = kmer_head_append("ACGT", base_array); //base_array is a char str[4]
因此,在您的原型中,您需要:
char** kmer_head_append(const char *kmer, char base[4])
你可以像malloc base那样:
char **edge = malloc(sizeof(char *) * (4 + 1)); because base is equal to 4 and + 1 for putting NULL at the end
然后:
for ( i = 0; i < 4 + 1; i++ ) {
edge[i] = malloc(sizeof(char) * (5 + 1)) ; // 5 for the new string and + 1 for '\0'
一步一步做!
然后你只需要使用strcpy来完成你的行