Конкатенация строк в C - `strcpy (s1 + = strlen (s1), s2)` - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь понять метод для конкатенации строк, предложенный в «Стандартной библиотеке Си».

После обсуждения того, как объединить две строки, s1 и s2. Автор предлагает, что для нескольких строк (более 2),

"... одобрить форму, такую ​​как strcpy(s1 += strlen(s1), s2), которая сохраняет повторные и постоянно увеличивающиеся повторные сканирования начальной части строки ..." (стр. 395)

У меня проблемы с осмыслением этого фрагмента кода. Насколько я понимаю, он добавляет к указателю длину s1, чтобы передать индекс символа Null в strcpy, так что strcpy не придется перебирать s1, чтобы найти символ Null, и он может просто начать копирование s2 в s1, это правильно?

Если мое понимание верно, как это может привести к какой-либо эффективности, когда вместо strcpy strlen все равно придется перебирать строку, чтобы определить ее длину?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

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 голосов
/ 17 января 2019

Да: s1 += strlen(s1) даст вам указатель на завершающий 0, поэтому strcpy(..., s2) будет работать как strcat() - добавление s2 к s1 (при условии, что в * 1006 достаточно места) *. Заметьте, что strcpy() не "зацикливает s1, чтобы найти ноль" - он просто записывает в указанном месте, strcat все же находит ноль.

Ключом к оптимизации является +=, который мы на самом деле меняем s1 (вам лучше взять копию исходного значения). Таким образом, мы берем только длину последней добавленной строки, а не длину от начала первой строки (что и должно делать решение strcat).

...