You can use the functions described in this section to copy the contents of strings and arrays, or to append the contents of one string to another. These functions are declared in the header file `string.h'.
A helpful way to remember the ordering of the arguments to the functions in this section is that it corresponds to an assignment expression, with the destination array specified to the left of the source array. All of these functions return the address of the destination array.
Most of these functions do not work properly if the source and destination arrays overlap. For example, if the beginning of the destination array overlaps the end of the source array, the original contents of that part of the source array may get overwritten before it is copied. Even worse, in the case of the string functions, the null character marking the end of the string may be lost, and the copy function might get stuck in a loop trashing all the memory allocated to your program.
All functions that have problems copying between overlapping arrays are
explicitly identified in this manual. In addition to functions in this
section, there are a few others like sprintf
(see section Formatted Output Functions) and scanf
(see section Formatted Input Functions).
memcpy
function copies size bytes from the object
beginning at from into the object beginning at to. The
behavior of this function is undefined if the two arrays to and
from overlap; use memmove
instead if overlapping is possible.
The value returned by memcpy
is the value of to.
Here is an example of how you might use memcpy
to copy the
contents of an array:
struct foo *oldarray, *newarray; int arraysize; ... memcpy (new, old, arraysize * sizeof (struct foo));
memmove
copies the size bytes at from into the
size bytes at to, even if those two blocks of space
overlap. In the case of overlap, memmove
is careful to copy the
original values of the bytes in the block at from, including those
bytes which also belong to the block at to.
unsigned char
) into each of the first size bytes of the
object beginning at block. It returns the value of block.
memcpy
, this function has undefined results if the strings
overlap. The return value is the value of to.
strcpy
but always copies exactly
size characters into to.
If the length of from is more than size, then strncpy
copies just the first size characters. Note that in this case
there is no null terminator written into to.
If the length of from is less than size, then strncpy
copies all of from, followed by enough null characters to add up
to size characters in all. This behavior is rarely useful, but it
is specified by the ISO C standard.
The behavior of strncpy
is undefined if the strings overlap.
Using strncpy
as opposed to strcpy
is a way to avoid bugs
relating to writing past the end of the allocated space for to.
However, it can also make your program much slower in one common case:
copying a string which is probably small into a potentially large buffer.
In this case, size may be large, and when it is, strncpy
will
waste a considerable amount of time copying null characters.
malloc
; see
section Unconstrained Allocation. If malloc
cannot allocate space
for the new string, strdup
returns a null pointer. Otherwise it
returns a pointer to the new string.
strdup
but always copies at most
size characters into the newly allocated string.
If the length of s is more than size, then strndup
copies just the first size characters and adds a closing null
terminator. Otherwise all characters are copied and the string is
terminated.
This function is different to strncpy
in that it always
terminates the destination string.
strcpy
, except that it returns a pointer to
the end of the string to (that is, the address of the terminating
null character) rather than the beginning.
For example, this program uses stpcpy
to concatenate `foo'
and `bar' to produce `foobar', which it then prints.
#include <string.h> #include <stdio.h> int main (void) { char buffer[10]; char *to = buffer; to = stpcpy (to, "foo"); to = stpcpy (to, "bar"); puts (buffer); return 0; }
This function is not part of the ISO or POSIX standards, and is not customary on Unix systems, but we did not invent it either. Perhaps it comes from MS-DOG.
Its behavior is undefined if the strings overlap.
stpcpy
but copies always exactly
size characters into to.
If the length of from is more then size, then stpncpy
copies just the first size characters and returns a pointer to the
character directly following the one which was copied last. Note that in
this case there is no null terminator written into to.
If the length of from is less than size, then stpncpy
copies all of from, followed by enough null characters to add up
to size characters in all. This behaviour is rarely useful, but it
is implemented to be useful in contexts where this behaviour of the
strncpy
is used. stpncpy
returns a pointer to the
first written null character.
This function is not part of ISO or POSIX but was found useful while developing GNU C Library itself.
Its behaviour is undefined if the strings overlap.
strdup
but allocates the new string
using alloca
instead of malloc
see section Automatic Storage with Variable Size. This means of course the returned
string has the same limitations as any block of memory allocated using
alloca
.
For obvious reasons strdupa
is implemented only as a macro. I.e.,
you cannot get the address of this function. Despite this limitations
it is a useful function. The following code shows a situation where
using malloc
would be a lot more expensive.
#include <paths.h> #include <string.h> #include <stdio.h> const char path[] = _PATH_STDPATH; int main (void) { char *wr_path = strdupa (path); char *cp = strtok (wr_path, ":"); while (cp != NULL) { puts (cp); cp = strtok (NULL, ":"); } return 0; }
Please note that calling strtok
using path directly is
illegal.
This function is only available if GNU CC is used.
strndup
but like strdupa
it
allocates the new string using alloca
see section Automatic Storage with Variable Size. The same advantages and limitations
of strdupa
are valid for strndupa
, too.
This function is implemented only as a macro which means one cannot get the address of it.
strndupa
is only available if GNU CC is used.
strcat
function is similar to strcpy
, except that the
characters from from are concatenated or appended to the end of
to, instead of overwriting it. That is, the first character from
from overwrites the null character marking the end of to.
An equivalent definition for strcat
would be:
char * strcat (char *to, const char *from) { strcpy (to + strlen (to), from); return to; }
This function has undefined results if the strings overlap.
strcat
except that not more than size
characters from from are appended to the end of to. A
single null character is also always appended to to, so the total
allocated size of to must be at least size + 1
bytes
longer than its initial length.
The strncat
function could be implemented like this:
char * strncat (char *to, const char *from, size_t size) { strncpy (to + strlen (to), from, size); return to; }
The behavior of strncat
is undefined if the strings overlap.
Here is an example showing the use of strncpy
and strncat
.
Notice how, in the call to strncat
, the size parameter
is computed to avoid overflowing the character array buffer
.
#include <string.h> #include <stdio.h> #define SIZE 10 static char buffer[SIZE]; main () { strncpy (buffer, "hello", SIZE); puts (buffer); strncat (buffer, ", world", SIZE - strlen (buffer) - 1); puts (buffer); }
The output produced by this program looks like:
hello hello, wo
memmove
, derived from
BSD. Note that it is not quite equivalent to memmove
, because the
arguments are not in the same order.
memset
, derived from
BSD. Note that it is not as general as memset
, because the only
value it can store is zero.
Go to the first, previous, next, last section, table of contents.