【问题标题】:C - Add char to beginnig of stringC - 将字符添加到字符串的开头
【发布时间】:2019-09-19 03:38:43
【问题描述】:

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

例如:

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" 输出是一个数组,其中元素是ADEFGCDEFGGDEFG e TDEFG

【问题讨论】:

  • 您能否修改示例中使用的名称,使它们以您想要的方式相互对应?或者至少提供一个对您的函数的示例调用?很难跟踪对应关系以确定您打算做什么。
  • 还要注意,“追加”是在末尾添加一些东西。你似乎想要做的是prepend.
  • 不是很清楚,请更改您的示例并向我们展示char *kmer = "WXYZ" 的预期结果。
  • @Jabberwocky 我只是用你的例子编辑
  • 也许你应该创建一个类似char *concatenate_char_str(char prefix, const char *str) { char *ret=malloc(1+strlen(str)+1); ret[0]=prefix; strcpy(ret+1, str); return ret; } 的函数并在你的函数中使用它。将您的问题分成足够小的块,以便于理解。

标签: c string dynamic-memory-allocation


【解决方案1】:

您可以使用 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 基数:

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做你的行

【讨论】:

    【解决方案2】:

    您需要char 而不是char ** 的大小

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

    如果要复制单个char,请不要使用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);
    

    【讨论】:

    • strlen 不适用于非 NUL 终止的字符串,例如 base_array
    • sprintf 替代方案更加清晰和简单。同样可以手动完成,但我不明白为什么有人会想要这样做。
    • @kiranBiradar 谢谢!我只有一个问题,我不明白为什么它会用valgrind 生成所有错误。当我调用该函数时,在循环中我销毁 free(*(edge + i)) 和之后 for free(edge)
    猜你喜欢
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2014-08-03
    • 1970-01-01
    • 2020-12-18
    • 2017-02-07
    • 2023-03-05
    相关资源
    最近更新 更多