Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-将字符添加到字符串的开头_C_String_Dynamic Memory Allocation - Fatal编程技术网

C-将字符添加到字符串的开头

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

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

例如:

字符基_数组[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\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
e
TDEFG

,则需要
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))
的循环中以及在for
free(edge)
for ( i = 0; i < 4 + 1; i++ ) {
        edge[i] = malloc(sizeof(char) * (5 + 1)) ; // 5 for the new string and + 1 for '\0'