<html lang="en">
<head>
<title>Copying and Concatenation - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="String-and-Array-Utilities.html#String-and-Array-Utilities" title="String and Array Utilities">
<link rel="prev" href="String-Length.html#String-Length" title="String Length">
<link rel="next" href="String_002fArray-Comparison.html#String_002fArray-Comparison" title="String/Array Comparison">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.

This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).

Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below.  A
copy of the license is included in the section entitled "GNU Free
Documentation License".

(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual.  Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
  pre.display { font-family:inherit }
  pre.format  { font-family:inherit }
  pre.smalldisplay { font-family:inherit; font-size:smaller }
  pre.smallformat  { font-family:inherit; font-size:smaller }
  pre.smallexample { font-size:smaller }
  pre.smalllisp    { font-size:smaller }
  span.sc    { font-variant:small-caps }
  span.roman { font-family:serif; font-weight:normal; } 
  span.sansserif { font-family:sans-serif; font-weight:normal; } 
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="Copying-and-Concatenation"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="String_002fArray-Comparison.html#String_002fArray-Comparison">String/Array Comparison</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="String-Length.html#String-Length">String Length</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="String-and-Array-Utilities.html#String-and-Array-Utilities">String and Array Utilities</a>
<hr>
</div>

<h3 class="section">5.4 Copying and Concatenation</h3>

<p>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.  The &lsquo;<samp><span class="samp">str</span></samp>&rsquo; and &lsquo;<samp><span class="samp">mem</span></samp>&rsquo; functions are declared in the
header file <samp><span class="file">string.h</span></samp> while the &lsquo;<samp><span class="samp">wstr</span></samp>&rsquo; and &lsquo;<samp><span class="samp">wmem</span></samp>&rsquo;
functions are declared in the file <samp><span class="file">wchar.h</span></samp>. 
<a name="index-string_002eh-478"></a><a name="index-wchar_002eh-479"></a><a name="index-copying-strings-and-arrays-480"></a><a name="index-string-copy-functions-481"></a><a name="index-array-copy-functions-482"></a><a name="index-concatenating-strings-483"></a><a name="index-string-concatenation-functions-484"></a>
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.

   <p>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.

   <p>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 <code>sprintf</code> (see <a href="Formatted-Output-Functions.html#Formatted-Output-Functions">Formatted Output Functions</a>) and <code>scanf</code> (see <a href="Formatted-Input-Functions.html#Formatted-Input-Functions">Formatted Input Functions</a>).

<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: void * <b>memcpy</b> (<var>void *restrict to, const void *restrict from, size_t size</var>)<var><a name="index-memcpy-485"></a></var><br>
<blockquote><p>The <code>memcpy</code> function copies <var>size</var> bytes from the object
beginning at <var>from</var> into the object beginning at <var>to</var>.  The
behavior of this function is undefined if the two arrays <var>to</var> and
<var>from</var> overlap; use <code>memmove</code> instead if overlapping is possible.

        <p>The value returned by <code>memcpy</code> is the value of <var>to</var>.

        <p>Here is an example of how you might use <code>memcpy</code> to copy the
contents of an array:

     <pre class="smallexample">          struct foo *oldarray, *newarray;
          int arraysize;
          ...
          memcpy (new, old, arraysize * sizeof (struct foo));
</pre>
        </blockquote></div>

<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wmemcpy</b> (<var>wchar_t *restrict wto, const wchar_t *restrict wfrom, size_t size</var>)<var><a name="index-wmemcpy-486"></a></var><br>
<blockquote><p>The <code>wmemcpy</code> function copies <var>size</var> wide characters from the object
beginning at <var>wfrom</var> into the object beginning at <var>wto</var>.  The
behavior of this function is undefined if the two arrays <var>wto</var> and
<var>wfrom</var> overlap; use <code>wmemmove</code> instead if overlapping is possible.

        <p>The following is a possible implementation of <code>wmemcpy</code> but there
are more optimizations possible.

     <pre class="smallexample">          wchar_t *
          wmemcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom,
                   size_t size)
          {
            return (wchar_t *) memcpy (wto, wfrom, size * sizeof (wchar_t));
          }
</pre>
        <p>The value returned by <code>wmemcpy</code> is the value of <var>wto</var>.

        <p>This function was introduced in Amendment&nbsp;1<!-- /@w --> to ISO&nbsp;C90<!-- /@w -->. 
</p></blockquote></div>

<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: void * <b>mempcpy</b> (<var>void *restrict to, const void *restrict from, size_t size</var>)<var><a name="index-mempcpy-487"></a></var><br>
<blockquote><p>The <code>mempcpy</code> function is nearly identical to the <code>memcpy</code>
function.  It copies <var>size</var> bytes from the object beginning at
<code>from</code> into the object pointed to by <var>to</var>.  But instead of
returning the value of <var>to</var> it returns a pointer to the byte
following the last written byte in the object beginning at <var>to</var>. 
I.e., the value is <code>((void *) ((char *) </code><var>to</var><code> + </code><var>size</var><code>))</code>.

        <p>This function is useful in situations where a number of objects shall be
copied to consecutive memory positions.

     <pre class="smallexample">          void *
          combine (void *o1, size_t s1, void *o2, size_t s2)
          {
            void *result = malloc (s1 + s2);
            if (result != NULL)
              mempcpy (mempcpy (result, o1, s1), o2, s2);
            return result;
          }
</pre>
        <p>This function is a GNU extension. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: wchar_t * <b>wmempcpy</b> (<var>wchar_t *restrict wto, const wchar_t *restrict wfrom, size_t size</var>)<var><a name="index-wmempcpy-488"></a></var><br>
<blockquote><p>The <code>wmempcpy</code> function is nearly identical to the <code>wmemcpy</code>
function.  It copies <var>size</var> wide characters from the object
beginning at <code>wfrom</code> into the object pointed to by <var>wto</var>.  But
instead of returning the value of <var>wto</var> it returns a pointer to the
wide character following the last written wide character in the object
beginning at <var>wto</var>.  I.e., the value is <var>wto</var><code> + </code><var>size</var>.

        <p>This function is useful in situations where a number of objects shall be
copied to consecutive memory positions.

        <p>The following is a possible implementation of <code>wmemcpy</code> but there
are more optimizations possible.

     <pre class="smallexample">          wchar_t *
          wmempcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom,
                    size_t size)
          {
            return (wchar_t *) mempcpy (wto, wfrom, size * sizeof (wchar_t));
          }
</pre>
        <p>This function is a GNU extension. 
</p></blockquote></div>

<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: void * <b>memmove</b> (<var>void *to, const void *from, size_t size</var>)<var><a name="index-memmove-489"></a></var><br>
<blockquote><p><code>memmove</code> copies the <var>size</var> bytes at <var>from</var> into the
<var>size</var> bytes at <var>to</var>, even if those two blocks of space
overlap.  In the case of overlap, <code>memmove</code> is careful to copy the
original values of the bytes in the block at <var>from</var>, including those
bytes which also belong to the block at <var>to</var>.

        <p>The value returned by <code>memmove</code> is the value of <var>to</var>. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wmemmove</b> (<var>wchar *wto, const wchar_t *wfrom, size_t size</var>)<var><a name="index-wmemmove-490"></a></var><br>
<blockquote><p><code>wmemmove</code> copies the <var>size</var> wide characters at <var>wfrom</var>
into the <var>size</var> wide characters at <var>wto</var>, even if those two
blocks of space overlap.  In the case of overlap, <code>memmove</code> is
careful to copy the original values of the wide characters in the block
at <var>wfrom</var>, including those wide characters which also belong to the
block at <var>wto</var>.

        <p>The following is a possible implementation of <code>wmemcpy</code> but there
are more optimizations possible.

     <pre class="smallexample">          wchar_t *
          wmempcpy (wchar_t *restrict wto, const wchar_t *restrict wfrom,
                    size_t size)
          {
            return (wchar_t *) mempcpy (wto, wfrom, size * sizeof (wchar_t));
          }
</pre>
        <p>The value returned by <code>wmemmove</code> is the value of <var>wto</var>.

        <p>This function is a GNU extension. 
</p></blockquote></div>

<!-- string.h -->
<!-- SVID -->
<div class="defun">
&mdash; Function: void * <b>memccpy</b> (<var>void *restrict to, const void *restrict from, int c, size_t size</var>)<var><a name="index-memccpy-491"></a></var><br>
<blockquote><p>This function copies no more than <var>size</var> bytes from <var>from</var> to
<var>to</var>, stopping if a byte matching <var>c</var> is found.  The return
value is a pointer into <var>to</var> one byte past where <var>c</var> was copied,
or a null pointer if no byte matching <var>c</var> appeared in the first
<var>size</var> bytes of <var>from</var>. 
</p></blockquote></div>

<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: void * <b>memset</b> (<var>void *block, int c, size_t size</var>)<var><a name="index-memset-492"></a></var><br>
<blockquote><p>This function copies the value of <var>c</var> (converted to an
<code>unsigned char</code>) into each of the first <var>size</var> bytes of the
object beginning at <var>block</var>.  It returns the value of <var>block</var>. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wmemset</b> (<var>wchar_t *block, wchar_t wc, size_t size</var>)<var><a name="index-wmemset-493"></a></var><br>
<blockquote><p>This function copies the value of <var>wc</var> into each of the first
<var>size</var> wide characters of the object beginning at <var>block</var>.  It
returns the value of <var>block</var>. 
</p></blockquote></div>

<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: char * <b>strcpy</b> (<var>char *restrict to, const char *restrict from</var>)<var><a name="index-strcpy-494"></a></var><br>
<blockquote><p>This copies characters from the string <var>from</var> (up to and including
the terminating null character) into the string <var>to</var>.  Like
<code>memcpy</code>, this function has undefined results if the strings
overlap.  The return value is the value of <var>to</var>. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcscpy</b> (<var>wchar_t *restrict wto, const wchar_t *restrict wfrom</var>)<var><a name="index-wcscpy-495"></a></var><br>
<blockquote><p>This copies wide characters from the string <var>wfrom</var> (up to and
including the terminating null wide character) into the string
<var>wto</var>.  Like <code>wmemcpy</code>, this function has undefined results if
the strings overlap.  The return value is the value of <var>wto</var>. 
</p></blockquote></div>

<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: char * <b>strncpy</b> (<var>char *restrict to, const char *restrict from, size_t size</var>)<var><a name="index-strncpy-496"></a></var><br>
<blockquote><p>This function is similar to <code>strcpy</code> but always copies exactly
<var>size</var> characters into <var>to</var>.

        <p>If the length of <var>from</var> is more than <var>size</var>, then <code>strncpy</code>
copies just the first <var>size</var> characters.  Note that in this case
there is no null terminator written into <var>to</var>.

        <p>If the length of <var>from</var> is less than <var>size</var>, then <code>strncpy</code>
copies all of <var>from</var>, followed by enough null characters to add up
to <var>size</var> characters in all.  This behavior is rarely useful, but it
is specified by the ISO&nbsp;C<!-- /@w --> standard.

        <p>The behavior of <code>strncpy</code> is undefined if the strings overlap.

        <p>Using <code>strncpy</code> as opposed to <code>strcpy</code> is a way to avoid bugs
relating to writing past the end of the allocated space for <var>to</var>. 
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, <var>size</var> may be large, and when it is, <code>strncpy</code> will
waste a considerable amount of time copying null characters. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcsncpy</b> (<var>wchar_t *restrict wto, const wchar_t *restrict wfrom, size_t size</var>)<var><a name="index-wcsncpy-497"></a></var><br>
<blockquote><p>This function is similar to <code>wcscpy</code> but always copies exactly
<var>size</var> wide characters into <var>wto</var>.

        <p>If the length of <var>wfrom</var> is more than <var>size</var>, then
<code>wcsncpy</code> copies just the first <var>size</var> wide characters.  Note
that in this case there is no null terminator written into <var>wto</var>.

        <p>If the length of <var>wfrom</var> is less than <var>size</var>, then
<code>wcsncpy</code> copies all of <var>wfrom</var>, followed by enough null wide
characters to add up to <var>size</var> wide characters in all.  This
behavior is rarely useful, but it is specified by the ISO&nbsp;C<!-- /@w -->
standard.

        <p>The behavior of <code>wcsncpy</code> is undefined if the strings overlap.

        <p>Using <code>wcsncpy</code> as opposed to <code>wcscpy</code> is a way to avoid bugs
relating to writing past the end of the allocated space for <var>wto</var>. 
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, <var>size</var> may be large, and when it is, <code>wcsncpy</code> will
waste a considerable amount of time copying null wide characters. 
</p></blockquote></div>

<!-- string.h -->
<!-- SVID -->
<div class="defun">
&mdash; Function: char * <b>strdup</b> (<var>const char *s</var>)<var><a name="index-strdup-498"></a></var><br>
<blockquote><p>This function copies the null-terminated string <var>s</var> into a newly
allocated string.  The string is allocated using <code>malloc</code>; see
<a href="Unconstrained-Allocation.html#Unconstrained-Allocation">Unconstrained Allocation</a>.  If <code>malloc</code> cannot allocate space
for the new string, <code>strdup</code> returns a null pointer.  Otherwise it
returns a pointer to the new string. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcsdup</b> (<var>const wchar_t *ws</var>)<var><a name="index-wcsdup-499"></a></var><br>
<blockquote><p>This function copies the null-terminated wide character string <var>ws</var>
into a newly allocated string.  The string is allocated using
<code>malloc</code>; see <a href="Unconstrained-Allocation.html#Unconstrained-Allocation">Unconstrained Allocation</a>.  If <code>malloc</code>
cannot allocate space for the new string, <code>wcsdup</code> returns a null
pointer.  Otherwise it returns a pointer to the new wide character
string.

        <p>This function is a GNU extension. 
</p></blockquote></div>

<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: char * <b>strndup</b> (<var>const char *s, size_t size</var>)<var><a name="index-strndup-500"></a></var><br>
<blockquote><p>This function is similar to <code>strdup</code> but always copies at most
<var>size</var> characters into the newly allocated string.

        <p>If the length of <var>s</var> is more than <var>size</var>, then <code>strndup</code>
copies just the first <var>size</var> characters and adds a closing null
terminator.  Otherwise all characters are copied and the string is
terminated.

        <p>This function is different to <code>strncpy</code> in that it always
terminates the destination string.

        <p><code>strndup</code> is a GNU extension. 
</p></blockquote></div>

<!-- string.h -->
<!-- Unknown origin -->
<div class="defun">
&mdash; Function: char * <b>stpcpy</b> (<var>char *restrict to, const char *restrict from</var>)<var><a name="index-stpcpy-501"></a></var><br>
<blockquote><p>This function is like <code>strcpy</code>, except that it returns a pointer to
the end of the string <var>to</var> (that is, the address of the terminating
null character <code>to + strlen (from)</code>) rather than the beginning.

        <p>For example, this program uses <code>stpcpy</code> to concatenate &lsquo;<samp><span class="samp">foo</span></samp>&rsquo;
and &lsquo;<samp><span class="samp">bar</span></samp>&rsquo; to produce &lsquo;<samp><span class="samp">foobar</span></samp>&rsquo;, which it then prints.

     <pre class="smallexample">          #include &lt;string.h&gt;
          #include &lt;stdio.h&gt;
          
          int
          main (void)
          {
            char buffer[10];
            char *to = buffer;
            to = stpcpy (to, "foo");
            to = stpcpy (to, "bar");
            puts (buffer);
            return 0;
          }
</pre>
        <p>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.

        <p>Its behavior is undefined if the strings overlap.  The function is
declared in <samp><span class="file">string.h</span></samp>. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcpcpy</b> (<var>wchar_t *restrict wto, const wchar_t *restrict wfrom</var>)<var><a name="index-wcpcpy-502"></a></var><br>
<blockquote><p>This function is like <code>wcscpy</code>, except that it returns a pointer to
the end of the string <var>wto</var> (that is, the address of the terminating
null character <code>wto + strlen (wfrom)</code>) rather than the beginning.

        <p>This function is not part of ISO or POSIX but was found useful while
developing the GNU C Library itself.

        <p>The behavior of <code>wcpcpy</code> is undefined if the strings overlap.

        <p><code>wcpcpy</code> is a GNU extension and is declared in <samp><span class="file">wchar.h</span></samp>. 
</p></blockquote></div>

<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: char * <b>stpncpy</b> (<var>char *restrict to, const char *restrict from, size_t size</var>)<var><a name="index-stpncpy-503"></a></var><br>
<blockquote><p>This function is similar to <code>stpcpy</code> but copies always exactly
<var>size</var> characters into <var>to</var>.

        <p>If the length of <var>from</var> is more then <var>size</var>, then <code>stpncpy</code>
copies just the first <var>size</var> 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 <var>to</var>.

        <p>If the length of <var>from</var> is less than <var>size</var>, then <code>stpncpy</code>
copies all of <var>from</var>, followed by enough null characters to add up
to <var>size</var> characters in all.  This behavior is rarely useful, but it
is implemented to be useful in contexts where this behavior of the
<code>strncpy</code> is used.  <code>stpncpy</code> returns a pointer to the
<em>first</em> written null character.

        <p>This function is not part of ISO or POSIX but was found useful while
developing the GNU C Library itself.

        <p>Its behavior is undefined if the strings overlap.  The function is
declared in <samp><span class="file">string.h</span></samp>. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- GNU -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcpncpy</b> (<var>wchar_t *restrict wto, const wchar_t *restrict wfrom, size_t size</var>)<var><a name="index-wcpncpy-504"></a></var><br>
<blockquote><p>This function is similar to <code>wcpcpy</code> but copies always exactly
<var>wsize</var> characters into <var>wto</var>.

        <p>If the length of <var>wfrom</var> is more then <var>size</var>, then
<code>wcpncpy</code> copies just the first <var>size</var> wide characters and
returns a pointer to the wide character directly following the last
non-null wide character which was copied last.  Note that in this case
there is no null terminator written into <var>wto</var>.

        <p>If the length of <var>wfrom</var> is less than <var>size</var>, then <code>wcpncpy</code>
copies all of <var>wfrom</var>, followed by enough null characters to add up
to <var>size</var> characters in all.  This behavior is rarely useful, but it
is implemented to be useful in contexts where this behavior of the
<code>wcsncpy</code> is used.  <code>wcpncpy</code> returns a pointer to the
<em>first</em> written null character.

        <p>This function is not part of ISO or POSIX but was found useful while
developing the GNU C Library itself.

        <p>Its behavior is undefined if the strings overlap.

        <p><code>wcpncpy</code> is a GNU extension and is declared in <samp><span class="file">wchar.h</span></samp>. 
</p></blockquote></div>

<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Macro: char * <b>strdupa</b> (<var>const char *s</var>)<var><a name="index-strdupa-505"></a></var><br>
<blockquote><p>This macro is similar to <code>strdup</code> but allocates the new string
using <code>alloca</code> instead of <code>malloc</code> (see <a href="Variable-Size-Automatic.html#Variable-Size-Automatic">Variable Size Automatic</a>).  This means of course the returned string has the same
limitations as any block of memory allocated using <code>alloca</code>.

        <p>For obvious reasons <code>strdupa</code> is implemented only as a macro;
you cannot get the address of this function.  Despite this limitation
it is a useful function.  The following code shows a situation where
using <code>malloc</code> would be a lot more expensive.

     <pre class="smallexample">          #include &lt;paths.h&gt;
          #include &lt;string.h&gt;
          #include &lt;stdio.h&gt;
          
          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;
          }
</pre>
        <p>Please note that calling <code>strtok</code> using <var>path</var> directly is
invalid.  It is also not allowed to call <code>strdupa</code> in the argument
list of <code>strtok</code> since <code>strdupa</code> uses <code>alloca</code>
(see <a href="Variable-Size-Automatic.html#Variable-Size-Automatic">Variable Size Automatic</a>) can interfere with the parameter
passing.

        <p>This function is only available if GNU CC is used. 
</p></blockquote></div>

<!-- string.h -->
<!-- GNU -->
<div class="defun">
&mdash; Macro: char * <b>strndupa</b> (<var>const char *s, size_t size</var>)<var><a name="index-strndupa-506"></a></var><br>
<blockquote><p>This function is similar to <code>strndup</code> but like <code>strdupa</code> it
allocates the new string using <code>alloca</code>
see <a href="Variable-Size-Automatic.html#Variable-Size-Automatic">Variable Size Automatic</a>.  The same advantages and limitations
of <code>strdupa</code> are valid for <code>strndupa</code>, too.

        <p>This function is implemented only as a macro, just like <code>strdupa</code>. 
Just as <code>strdupa</code> this macro also must not be used inside the
parameter list in a function call.

        <p><code>strndupa</code> is only available if GNU CC is used. 
</p></blockquote></div>

<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: char * <b>strcat</b> (<var>char *restrict to, const char *restrict from</var>)<var><a name="index-strcat-507"></a></var><br>
<blockquote><p>The <code>strcat</code> function is similar to <code>strcpy</code>, except that the
characters from <var>from</var> are concatenated or appended to the end of
<var>to</var>, instead of overwriting it.  That is, the first character from
<var>from</var> overwrites the null character marking the end of <var>to</var>.

        <p>An equivalent definition for <code>strcat</code> would be:

     <pre class="smallexample">          char *
          strcat (char *restrict to, const char *restrict from)
          {
            strcpy (to + strlen (to), from);
            return to;
          }
</pre>
        <p>This function has undefined results if the strings overlap. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcscat</b> (<var>wchar_t *restrict wto, const wchar_t *restrict wfrom</var>)<var><a name="index-wcscat-508"></a></var><br>
<blockquote><p>The <code>wcscat</code> function is similar to <code>wcscpy</code>, except that the
characters from <var>wfrom</var> are concatenated or appended to the end of
<var>wto</var>, instead of overwriting it.  That is, the first character from
<var>wfrom</var> overwrites the null character marking the end of <var>wto</var>.

        <p>An equivalent definition for <code>wcscat</code> would be:

     <pre class="smallexample">          wchar_t *
          wcscat (wchar_t *wto, const wchar_t *wfrom)
          {
            wcscpy (wto + wcslen (wto), wfrom);
            return wto;
          }
</pre>
        <p>This function has undefined results if the strings overlap. 
</p></blockquote></div>

   <p>Programmers using the <code>strcat</code> or <code>wcscat</code> function (or the
following <code>strncat</code> or <code>wcsncar</code> functions for that matter)
can easily be recognized as lazy and reckless.  In almost all situations
the lengths of the participating strings are known (it better should be
since how can one otherwise ensure the allocated size of the buffer is
sufficient?)  Or at least, one could know them if one keeps track of the
results of the various function calls.  But then it is very inefficient
to use <code>strcat</code>/<code>wcscat</code>.  A lot of time is wasted finding the
end of the destination string so that the actual copying can start. 
This is a common example:

   <p><a name="index-g_t_005f_005fva_005fcopy-509"></a><a name="index-va_005fcopy-510"></a>
<pre class="smallexample">     /* <span class="roman">This function concatenates arbitrarily many strings.  The last</span>
        <span class="roman">parameter must be </span><code>NULL</code><span class="roman">.</span>  */
     char *
     concat (const char *str, ...)
     {
       va_list ap, ap2;
       size_t total = 1;
       const char *s;
       char *result;
     
       va_start (ap, str);
       /* <span class="roman">Actually </span><code>va_copy</code><span class="roman">, but this is the name more gcc versions</span>
          <span class="roman">understand.</span>  */
       __va_copy (ap2, ap);
     
       /* <span class="roman">Determine how much space we need.</span>  */
       for (s = str; s != NULL; s = va_arg (ap, const char *))
         total += strlen (s);
     
       va_end (ap);
     
       result = (char *) malloc (total);
       if (result != NULL)
         {
           result[0] = '\0';
     
           /* <span class="roman">Copy the strings.</span>  */
           for (s = str; s != NULL; s = va_arg (ap2, const char *))
             strcat (result, s);
         }
     
       va_end (ap2);
     
       return result;
     }
</pre>
   <p>This looks quite simple, especially the second loop where the strings
are actually copied.  But these innocent lines hide a major performance
penalty.  Just imagine that ten strings of 100 bytes each have to be
concatenated.  For the second string we search the already stored 100
bytes for the end of the string so that we can append the next string. 
For all strings in total the comparisons necessary to find the end of
the intermediate results sums up to 5500!  If we combine the copying
with the search for the allocation we can write this function more
efficient:

<pre class="smallexample">     char *
     concat (const char *str, ...)
     {
       va_list ap;
       size_t allocated = 100;
       char *result = (char *) malloc (allocated);
     
       if (result != NULL)
         {
           char *newp;
           char *wp;
     
           va_start (ap, str);
     
           wp = result;
           for (s = str; s != NULL; s = va_arg (ap, const char *))
             {
               size_t len = strlen (s);
     
               /* <span class="roman">Resize the allocated memory if necessary.</span>  */
               if (wp + len + 1 &gt; result + allocated)
                 {
                   allocated = (allocated + len) * 2;
                   newp = (char *) realloc (result, allocated);
                   if (newp == NULL)
                     {
                       free (result);
                       return NULL;
                     }
                   wp = newp + (wp - result);
                   result = newp;
                 }
     
               wp = mempcpy (wp, s, len);
             }
     
           /* <span class="roman">Terminate the result string.</span>  */
           *wp++ = '\0';
     
           /* <span class="roman">Resize memory to the optimal size.</span>  */
           newp = realloc (result, wp - result);
           if (newp != NULL)
             result = newp;
     
           va_end (ap);
         }
     
       return result;
     }
</pre>
   <p>With a bit more knowledge about the input strings one could fine-tune
the memory allocation.  The difference we are pointing to here is that
we don't use <code>strcat</code> anymore.  We always keep track of the length
of the current intermediate result so we can safe us the search for the
end of the string and use <code>mempcpy</code>.  Please note that we also
don't use <code>stpcpy</code> which might seem more natural since we handle
with strings.  But this is not necessary since we already know the
length of the string and therefore can use the faster memory copying
function.  The example would work for wide characters the same way.

   <p>Whenever a programmer feels the need to use <code>strcat</code> she or he
should think twice and look through the program whether the code cannot
be rewritten to take advantage of already calculated results.  Again: it
is almost always unnecessary to use <code>strcat</code>.

<!-- string.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: char * <b>strncat</b> (<var>char *restrict to, const char *restrict from, size_t size</var>)<var><a name="index-strncat-511"></a></var><br>
<blockquote><p>This function is like <code>strcat</code> except that not more than <var>size</var>
characters from <var>from</var> are appended to the end of <var>to</var>.  A
single null character is also always appended to <var>to</var>, so the total
allocated size of <var>to</var> must be at least <var>size</var><code> + 1</code> bytes
longer than its initial length.

        <p>The <code>strncat</code> function could be implemented like this:

     <pre class="smallexample">          char *
          strncat (char *to, const char *from, size_t size)
          {
            to[strlen (to) + size] = '\0';
            strncpy (to + strlen (to), from, size);
            return to;
          }
</pre>
        <p>The behavior of <code>strncat</code> is undefined if the strings overlap. 
</p></blockquote></div>

<!-- wchar.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: wchar_t * <b>wcsncat</b> (<var>wchar_t *restrict wto, const wchar_t *restrict wfrom, size_t size</var>)<var><a name="index-wcsncat-512"></a></var><br>
<blockquote><p>This function is like <code>wcscat</code> except that not more than <var>size</var>
characters from <var>from</var> are appended to the end of <var>to</var>.  A
single null character is also always appended to <var>to</var>, so the total
allocated size of <var>to</var> must be at least <var>size</var><code> + 1</code> bytes
longer than its initial length.

        <p>The <code>wcsncat</code> function could be implemented like this:

     <pre class="smallexample">          wchar_t *
          wcsncat (wchar_t *restrict wto, const wchar_t *restrict wfrom,
                   size_t size)
          {
            wto[wcslen (to) + size] = L'\0';
            wcsncpy (wto + wcslen (wto), wfrom, size);
            return wto;
          }
</pre>
        <p>The behavior of <code>wcsncat</code> is undefined if the strings overlap. 
</p></blockquote></div>

   <p>Here is an example showing the use of <code>strncpy</code> and <code>strncat</code>
(the wide character version is equivalent).  Notice how, in the call to
<code>strncat</code>, the <var>size</var> parameter is computed to avoid
overflowing the character array <code>buffer</code>.

<pre class="smallexample">     #include &lt;string.h&gt;
     #include &lt;stdio.h&gt;
     
     #define SIZE 10
     
     static char buffer[SIZE];
     
     main ()
     {
       strncpy (buffer, "hello", SIZE);
       puts (buffer);
       strncat (buffer, ", world", SIZE - strlen (buffer) - 1);
       puts (buffer);
     }
</pre>
   <p class="noindent">The output produced by this program looks like:

<pre class="smallexample">     hello
     hello, wo
</pre>
   <!-- string.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: void <b>bcopy</b> (<var>const void *from, void *to, size_t size</var>)<var><a name="index-bcopy-513"></a></var><br>
<blockquote><p>This is a partially obsolete alternative for <code>memmove</code>, derived from
BSD.  Note that it is not quite equivalent to <code>memmove</code>, because the
arguments are not in the same order and there is no return value. 
</p></blockquote></div>

<!-- string.h -->
<!-- BSD -->
<div class="defun">
&mdash; Function: void <b>bzero</b> (<var>void *block, size_t size</var>)<var><a name="index-bzero-514"></a></var><br>
<blockquote><p>This is a partially obsolete alternative for <code>memset</code>, derived from
BSD.  Note that it is not as general as <code>memset</code>, because the only
value it can store is zero. 
</p></blockquote></div>

   </body></html>

