Поиск последнего символа из строки
Я предлагаю мысленный эксперимент: если бы вообще было возможно найти последний символ строки за время, превышающее O (n), тоне могли бы вы также реализовать strlen
в течение времени, превышающего O (n)?
Преобразование char
в char*
Вы можете временно сохранить char
в массиве из char
, и он превратится в указатель на char
:
char delimiterBuf[2] = "";
delimiterBuf[0] = delimiter;
...
strcat(text, delimiterBuf);
Если вы просто используете символьные литералы, вы можете просто использовать строкувместо литералов.
Использование strcat
с переменными, имеющими локальную область действия
Сама переменная не указана вне области действия.Когда функция возвращается, эта локальная переменная уже была оценена, а ее содержимое уже скопировано.
Как strcat
обрабатывает нулевой завершающий символ?
"Строки"в C - NUL-концевые последовательности символов.Оба входа в strcat
должны быть завершены NUL, а результат будет завершен NUL.Для strcat
было бы бесполезно записывать дополнительный NUL-байт в результат, если в этом нет необходимости.
(И если вам интересно, что, если входные строки имеют несколько завершающих NULУже байт, я предлагаю еще один мысленный эксперимент: как бы strcat
узнал, сколько концевых NUL-байтов в строке?)
Кстати, так как вы пометили это как "best-Practices", ятакже рекомендуем вам позаботиться о том, чтобы не записывать за пределы буфера назначения.Как правило, это означает, что нужно избегать strcat
и strcpy
(если вы уже не проверили, что входные строки не переполняют место назначения) и использовать более безопасные версии (например, strncat
. Обратите внимание, что strncpy
имеет свои собственные подводные камни, поэтомуэто плохая замена. Существуют также более безопасные версии, которые нестандартны, такие как strlcpy
/ strlcat
и strcpy_s
/ strcat_s
.)
Аналогично, такие функции, как ваша функция foo
всегда должен принимать дополнительный аргумент, определяющий размер буфера назначения (и документация должна четко указывать, учитывает ли этот размер терминатор NUL или нет).