strcat, strncat — concatenate two strings
#include <string.h>
char
*strcat( |
char *dest, |
const char *src) ; |
char
*strncat( |
char *dest, |
const char *src, | |
size_t n) ; |
The strcat
() function
appends the src
string to the dest
string, overwriting the terminating null byte ('\0') at the
end of dest
, and then
adds a terminating null byte. The strings may not overlap,
and the dest
string
must have enough space for the result. If dest
is not large enough,
program behavior is unpredictable; buffer overruns are a favorite avenue for
attacking secure programs.
The strncat
() function is
similar, except that
it will use at most n
bytes from src
; and
src
does not
need to be null-terminated if it contains n
or more bytes.
As with strcat
(), the
resulting string in dest
is always
null-terminated.
If src
contains
n
or more bytes,
strncat
() writes n+1
bytes to dest
(n
from src
plus the terminating null
byte). Therefore, the size of dest
must be at least
strlen(dest)+n+1
.
A simple implementation of strncat
() might be:
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; }
For an explanation of the terms used in this section, see attributes(7).
Interface | Attribute | Value |
strcat (), strncat () |
Thread safety | MT-Safe |
Some systems (the BSDs, Solaris, and others) provide the following function:
size_t strlcat(char *dest, const char *src, size_t size);
This function appends the null-terminated string
src
to the string
dest
, copying at most
size−strlen(dest)−1
from src
, and adds a
terminating null byte to the result, unless
size
is less than strlen(dest)
. This function
fixes the buffer overrun problem of strcat
(), but the caller must still handle
the possibility of data loss if size
is too small. The function returns the
length of the string strlcat
()
tried to create; if the return value is greater than or equal
to size
, data loss occurred. If
data loss matters, the caller must either check the arguments
before the call, or test the function return value.
strlcat
() is not present in
glibc and is not standardized by POSIX, but is available on
Linux via the libbsd
library.
Because strcat
() and
strncat
() must find the null
byte that terminates the string dest
using a search that starts
at the beginning of the string, the execution time of these
functions scales according to the length of the string
dest
. This can be
demonstrated by running the program below. (If the goal is to
concatenate many strings to one target, then manually copying
the bytes from each source string while maintaining a pointer
to the end of the target string will provide better
performance.)
#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"); } }
This page is part of release 4.07 of the Linux man-pages
project. A
description of the project, information about reporting bugs,
and the latest version of this page, can be found at
https://www.kernel.org/doc/man−pages/.
Copyright 1993 David Metcalfe (davidprism.demon.co.uk) %%%LICENSE_START(VERBATIM) Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies. Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one. Since the Linux kernel and libraries are constantly changing, this manual page may be incorrect or out-of-date. The author(s) assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. The author(s) may not have taken the same level of care in the production of this manual, which is licensed free of charge, as they might when working professionally. Formatted or processed versions of this manual, if unaccompanied by the source, must acknowledge the copyright and authors of this work. %%%LICENSE_END References consulted: Linux libc source code Lewine's _POSIX Programmer's Guide_ (O'Reilly & Associates, 1991) 386BSD man pages Modified Sat Jul 24 18:11:47 1993 by Rik Faith (faithcs.unc.edu) 2007-06-15, Marc Boyer <marc.boyerenseeiht.fr> + mtk Improve discussion of strncat(). |