C-将字符添加到字符串的开头
我尝试创建一个字符串数组,其中每个元素都是字符和字符串的串联 例如: 字符基_数组[4]={'A','C','G','T'} char*kmer=“ACGT” char*edge[4]={“AACGT”、“CACGT”、“GACGT”、“TACGT”} 我尝试使用这段代码,但产生了分段错误C-将字符添加到字符串的开头,c,string,dynamic-memory-allocation,C,String,Dynamic Memory Allocation,我尝试创建一个字符串数组,其中每个元素都是字符和字符串的串联 例如: 字符基_数组[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
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\u head\u append(常量char*kmer,常量char*base){
int i;
char**edge=malloc(BASE*sizeof(char*));
对于(i=0;i
编辑:
如果
char*kmer=“DEFG”
输出是一个数组,其中元素是ADEFG
,CDEFG
,GDEFG
eTDEFG
,则需要char
而不是char**
edge[i] = malloc((strlen(kmer) + 2)); //2 to hold char + \0
如果要复制单个字符,请不要使用strcpy
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
然后:
(i=0;i<4+1;i++)的{
edge[i]=malloc(sizeof(char)*(5+1));//5表示新字符串,+1表示'\0'
一步一步做
那么你只需要用strcpy做一行就行了。请修改示例中使用的名称,使它们以你想要的方式相互对应?或者至少向你的函数提供一个示例调用?很难跟踪对应关系来确定你想要做什么。还要注意“append”是在结尾添加一些内容。您似乎想做的是预结束。不太清楚,请更改您的示例,并向我们显示
char*kmer=“WXYZ”
@Jabberwocky的预期结果。我只是用您的示例编辑。也许您应该创建一个类似char*concatenate\u char\u str(char prefix,const char*str)的函数{char*ret=malloc(1+strlen(str)+1);ret[0]=前缀;strcpy(ret+1,str);return-ret;}
并在函数中使用它。将问题划分为足够小的块,以便易于理解。strlen
不适用于非NUL结尾的字符串,如base\u array
sprintf替代方法更清晰、更简单。同样的操作可以手动完成,但我不明白为什么有人会这样做想要这个。@kiranBiradar谢谢!我只有一个问题,我不明白为什么它会在valgrind
中生成所有错误。当我调用函数时,在我销毁free(*(edge+I))
的循环中以及在forfree(edge)
for ( i = 0; i < 4 + 1; i++ ) {
edge[i] = malloc(sizeof(char) * (5 + 1)) ; // 5 for the new string and + 1 for '\0'