STRCAT(3) | Руководство программиста Linux | STRCAT(3) |
strcat, strncat - объединяет две строки
#include <string.h>
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);
Функция strcat() добавляет строку src к строке dest, перезаписывая байт null ('\0') в конце dest и добавляет завершающий байт null. Строки не могут перекрываться, а в строке dest должно хватать свободного места для размещения объединённой строки. Если размер dest мал, то поведение программы непредсказуемо; переполнение буфера — любимое средство для атаки защищённых программ.
Функция strncat() работает аналогичным образом, но
Как и strcat(), строка-результат в dest всегда заканчивается байтом null.
Если в src содержится n или более байт, то strncat() записывает n+1 байт в dest (n из src плюс завершающий байт null). Поэтому размер dest должен быть не менее strlen(dest)+n+1.
Простейшей реализацией strncat() может быть:
char * strncat(char *dest, const char *src, size_t n) { size_t dest_len = strlen(dest); size_t i; for (i = 0 ; i < n && src[i] != '\0' ; i++) dest[dest_len + i] = src[i]; dest[dest_len + i] = '\0'; return dest; }
Функции strcat() и strncat() возвращают указатель на скопированную строку dest.
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение |
strcat(), strncat() | Безвредность в нитях | MT-Safe |
POSIX.1-2001, POSIX.1-2008, C89, C99, SVr4, 4.3BSD.
В некоторых системах (BSD, Solaris и других) есть следующая функция:
size_t strlcat(char *dest, const char *src, size_t size);
Эта функция добавляет строку src, оканчивающуюся null, к строке dest, копируя не более size-strlen(dest)-1 байт из src, и добавляет к результату конечный байт null, если size менее strlen(dest). Эта функция исправляет проблему с переполнением буфера в strcat(), но вызывающий по прежнему должен рассматривать возможность потери данных, если size слишком мал. Функция возвращает длину строки, которую strlcat() пыталась создать; если возвращаемое значение больше или равно size, то произошла потеря данных. Если потеря данных критична, то вызывающий должен или проверять аргументы перед вызовом, или проверять возвращаемое функцией значение. Функция strlcat() отсутствует в glibc и не стандартизована POSIX, но доступна в Linux в библиотеке libbsd.
Так как strcat() и strncat() должны найти байт null, завершающий строку dest, начиная поиск от начала строки, время выполнения этих функций пропорционально длине строки dest. Это можно увидеть из запуска программы, представленной ниже (если целью является склейка несколько строк в одну, то ручное копирование байт из одного источника и управление концом строки назначения будет более производительным).
#include <string.h> #include <time.h> #include <stdio.h> int main(int argc, char *argv[]) { #define LIM 4000000 int j; char p[LIM]; time_t base; base = time(NULL); p[0] = '\0'; for (j = 0; j < LIM; j++) { if ((j % 10000) == 0) printf("%d %ld\n", j, (long) (time(NULL) - base)); strcat(p, "a"); } }
bcopy(3), memccpy(3), memcpy(3), strcpy(3), string(3), strncpy(3), wcscat(3), wcsncat(3)
2019-03-06 | GNU |