сколько нулевых байтов, конкатенация строк в C - PullRequest
0 голосов
/ 24 января 2012

Если я хочу объединить 2 строки в C, мне нужно выделить дополнительный нулевой символ для каждой строки или достаточно одной?

int main(){
    char *s1 = NULL;
    char *s2 = NULL;
    char *s1_s2 = NULL;

    s1 = malloc(sizeof(char) * strlen("string1") + 1);
    strcpy(s1, "string1");
    s2 = malloc(sizeof(char) * strlen("string2") + 1);
    strcpy(s2, "string2");

    s1_s2 = malloc(sizeof(char) * (strlen(s1) + strlen(s2)) + 2); // shouldn't it be only 1 null char ?
    strcpy(s1_s2, s1);
    strcat(s1_s2, s2);
}

в этом вопросе, они используют 2 нулевых байта для каждой строки. Может кто-нибудь пролить свет? Спасибо

Ответы [ 5 ]

3 голосов
/ 24 января 2012

Нет, вам не нужно два дополнительных нулевых байта.

В памяти ваши строки будут выглядеть так:

s1 -> 's' 't' 'r' 'i' 'n' 'g' '1' '\0'

s2 -> 's' 't' 'r' 'i' 'n' 'g' '2' '\0'

s1_s2 -> 's' 't' 'r' 'i' 'n' 'g' '1' 's' 't' 'r' 'i' 'n' 'g' '2' '\0'
2 голосов
/ 24 января 2012

Требуется только один.

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

1 голос
/ 24 января 2012

В вопросе, с которым вы связаны, между строками, которые соединяются вместе, ставится пробел. Для этого места должен быть выделен дополнительный char.

В вашем примере вы не ставите пробел между строками, поэтому требуется только один дополнительный char.

1 голос
/ 24 января 2012

Нужен только один.Вам всегда нужен только один нулевой символ в конце строки, который здесь является конкатенацией двух строк.

1 голос
/ 24 января 2012

Последняя строка должна заканчиваться нулевым байтом, поэтому достаточно одного.

Edit: Вопрос, который вы отправили, между двумя строками есть пробел.

strcpy(both, first);
strcat(both, " ");
strcat(both, second);
...