сколько нулевых байтов, конкатенация строк в C

Если я хочу объединить 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 нулевых байта для каждая строка. Может ли кто-нибудь пролить свет? Спасибо


person Vlad Balmos    schedule 24.01.2012    source источник
comment
Для всех строк требуется только один дополнительный байт, поскольку имеется только один терминатор строки. То же самое касается s1_s2 в вашем примере.   -  person Some programmer dude    schedule 24.01.2012


Ответы (5)


Нужен только один.

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

person Vadim    schedule 24.01.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'
person Renan Greinert    schedule 24.01.2012

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

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

strcpy(both, first);
strcat(both, " ");
strcat(both, second);
person iabdalkader    schedule 24.01.2012

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

person leif    schedule 24.01.2012

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

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

person Mankarse    schedule 24.01.2012