C - Добавить символ в начало строки - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь создать массив строк, в котором каждый элемент является объединением символа и строки.

Например:

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

Ответы [ 2 ]

3 голосов
/ 30 апреля 2019

Вам нужен размер 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);
0 голосов
/ 30 апреля 2019

Вы можете использовать valgrind, чтобы увидеть, где вы находитесь. Segfault.

 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

...