Конкатенация строк в C - `strcpy (s1 + = strlen (s1), s2)`

Размещение new также очень полезно при сериализации (скажем, с boost :: serialization). В 10 лет c ++ это только второй случай, когда мне нужно новое место для размещения (третий, если вы включаете интервью :)).

2
задан M.O. 16 January 2019 в 22:32
поделиться

2 ответа

strcpy(s1 + strlen(s1),s2) действительно ограничивают количество повторного сканирования s1 с повторными вычислениями до дополнительной длины данного s2 в следующем раунде.

Но, IMO, вместо этого трюка лучше просто написать функцию, которая не требует какого-либо повторного сканирования:

char *
xstrcat(char *s1,const char *s2)
{

    for (;  *s1 != 0;  ++s1);

    for (;  *s2 != 0;  ++s1, ++s2)
        *s1 = *s2;
    *s1 = 0;

    return s1;
}

void
func(char *s1,const char *s2,const char *s3,const char *s4)
{

    s1 = xstrcat(s1,s2);
    s1 = xstrcat(s1,s3);
    s1 = xstrcat(s1,s4);
}
0
ответ дан Craig Estey 16 January 2019 в 22:32
поделиться

Да: s1 += strlen(s1) даст вам указатель на завершающий 0, поэтому strcpy(..., s2) будет работать как strcat() - добавление s2 к s1 (при условии, что в [115 достаточно места) ]. Обратите внимание, что strcpy() не «делает цикл через s1, чтобы найти ноль» - он просто записывает в указанном месте strcat, хотя и находит ноль.

Ключом к оптимизации является [ 118] мы на самом деле меняем s1 (лучше взять копию исходного значения), поэтому мы берем только длину последней добавленной строки, а не длину от начала первой строки (что и является [ 1110] решение подойдет).

0
ответ дан John3136 16 January 2019 в 22:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: