summaryrefslogtreecommitdiff
path: root/devdocs/c/string%2Fbyte%2Fmemccpy.html
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2024-04-07 13:41:34 -0500
committerCraig Jennings <c@cjennings.net>2024-04-07 13:41:34 -0500
commit754bbf7a25a8dda49b5d08ef0d0443bbf5af0e36 (patch)
treef1190704f78f04a2b0b4c977d20fe96a828377f1 /devdocs/c/string%2Fbyte%2Fmemccpy.html
new repository
Diffstat (limited to 'devdocs/c/string%2Fbyte%2Fmemccpy.html')
-rw-r--r--devdocs/c/string%2Fbyte%2Fmemccpy.html106
1 files changed, 106 insertions, 0 deletions
diff --git a/devdocs/c/string%2Fbyte%2Fmemccpy.html b/devdocs/c/string%2Fbyte%2Fmemccpy.html
new file mode 100644
index 00000000..a487a5ec
--- /dev/null
+++ b/devdocs/c/string%2Fbyte%2Fmemccpy.html
@@ -0,0 +1,106 @@
+ <h1 id="firstHeading" class="firstHeading">memccpy</h1> <table class="t-dcl-begin"> <tr class="t-dsc-header"> <th> Defined in header <code>&lt;string.h&gt;</code> </th> <th> </th> <th> </th> </tr> <tr class="t-dcl t-since-c23"> <td> <pre data-language="c">void* memccpy( void* restrict dest, const void* restrict src, int c, size_t count );</pre>
+</td> <td class="t-dcl-nopad"> </td> <td> <span class="t-mark-rev t-since-c23">(since C23)</span> </td> </tr> </table> <p>Copies bytes from the object pointed to by <code>src</code> to the object pointed to by <code>dest</code>, stopping after <i>any</i> of the next two conditions are satisfied:</p>
+<ul>
+<li> <code>count</code> bytes are copied </li>
+<li> the byte <code>(unsigned char)c</code> is found (and copied). </li>
+</ul> <p>The <code>src</code> and <code>dest</code> objects are interpreted as arrays of <code>unsigned char</code>.</p>
+<p>The behavior is undefined if <i>any</i> condition is met:</p>
+<ul>
+<li> access occurs beyond the end of the <code>dest</code> array; </li>
+<li> the objects overlap (which is a violation of the <a href="../../language/restrict" title="c/language/restrict"><code>restrict</code></a> contract) </li>
+<li> either <code>dest</code> or <code>src</code> is an invalid or null pointer </li>
+</ul> <h3 id="Parameters"> Parameters</h3> <table class="t-par-begin"> <tr class="t-par"> <td> dest </td> <td> - </td> <td> pointer to the object to copy to </td>
+</tr> <tr class="t-par"> <td> src </td> <td> - </td> <td> pointer to the object to copy from </td>
+</tr> <tr class="t-par"> <td> c </td> <td> - </td> <td> terminating byte, converted to <code>unsigned char</code> at first </td>
+</tr> <tr class="t-par"> <td> count </td> <td> - </td> <td> number of bytes to copy </td>
+</tr>
+</table> <h3 id="Return_value"> Return value</h3> <p>If the byte <code>(unsigned char)c</code> was found, <code>memccpy</code> returns a pointer to the next byte in <code>dest</code> after <code>(unsigned char)c</code>. Otherwise it returns a null pointer.</p>
+<h3 id="Notes"> Notes</h3> <p>The function is identical to the <a rel="nofollow" class="external text" href="https://pubs.opengroup.org/onlinepubs/9699919799/functions/memccpy.html">POSIX <code>memccpy</code></a>.</p>
+<p><code>memccpy(dest, src, 0, count)</code> behaves similar to <code><a href="http://en.cppreference.com/w/c/string/byte/strncpy"><span class="kw554">strncpy</span></a><span class="br0">(</span>dest, src, count<span class="br0">)</span></code>, except that the former returns a pointer to the <i>end</i> of the buffer written, and does not zero-pad the destination array. Thus, <code>memccpy</code> is useful for efficiently concatenating multiple strings.</p>
+<div class="c source-c"><pre data-language="c">char bigString[1000];
+char* end = bigString + sizeof bigString;
+
+char* p = memccpy(bigString, "John, ", '\0', sizeof bigString - 1);
+if (p)
+ p = memccpy(p - 1, "Paul, ", '\0', end - p);
+if (p)
+ p = memccpy(p - 1, "George, ", '\0', end - p);
+if (p)
+ p = memccpy(p - 1, "Joel ", '\0', end - p);
+if (!p)
+ end[-1] = '\0';
+
+puts(bigString); // John, Paul, George, Joel</pre></div> <h3 id="Example"> Example</h3> <div class="t-example"> <div class="c source-c"><pre data-language="c">#include &lt;ctype.h&gt;
+#include &lt;stdio.h&gt;
+#include &lt;string.h&gt;
+
+int main(void)
+{
+ const char src[] = "Stars: Altair, Sun, Vega.";
+ const char terminal[] = {':', ' ', ',', '.', '!'};
+ char dest[sizeof src];
+ const char alt = '@';
+
+ for (size_t i = 0; i != sizeof terminal; ++i)
+ {
+ void* to = memccpy(dest, src, terminal[i], sizeof dest);
+
+ printf("Terminal '%c' (%s):\t\"", terminal[i], to ? "found" : "absent");
+
+ // if `terminal` character was not found - print the whole `dest`
+ to = to ? to : dest + sizeof dest;
+
+ for (char* from = dest; from != to; ++from)
+ putchar(isprint(*from) ? *from : alt);
+
+ puts("\"");
+ }
+
+
+ puts("\n" "Separate star names from distances (ly):");
+ const char *star_distance[] = {
+ "Arcturus : 37", "Vega : 25", "Capella : 43", "Rigel : 860", "Procyon : 11"
+ };
+ char names_only[64];
+ char *first = names_only;
+ char *last = names_only + sizeof names_only;
+
+ for (size_t t = 0; t != (sizeof star_distance) / (sizeof star_distance[0]); ++t)
+ {
+ if (first)
+ first = memccpy(first, star_distance[t], ' ', last - first);
+ else
+ break;
+ }
+
+ if (first)
+ {
+ *first = '\0';
+ puts(names_only);
+ }
+ else
+ puts("Buffer is too small.");
+}</pre></div> <p>Output:</p>
+<div class="text source-text"><pre data-language="c">Terminal ':' (found): "Stars:"
+Terminal ' ' (found): "Stars: "
+Terminal ',' (found): "Stars: Altair,"
+Terminal '.' (found): "Stars: Altair, Sun, Vega."
+Terminal '!' (absent): "Stars: Altair, Sun, Vega.@"
+
+Separate star names from distances (ly):
+Arcturus Vega Capella Rigel Procyon</pre></div> </div> <h3 id="See_also"> See also</h3> <table class="t-dsc-begin"> <tr class="t-dsc"> <td> <div><a href="memcpy" title="c/string/byte/memcpy"> <span class="t-lines"><span>memcpy</span><span>memcpy_s</span></span></a></div>
+<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> copies one buffer to another <br> <span class="t-mark">(function)</span> </td>
+</tr> <tr class="t-dsc"> <td> <div><a href="../wide/wmemcpy" title="c/string/wide/wmemcpy"> <span class="t-lines"><span>wmemcpy</span><span>wmemcpy_s</span></span></a></div>
+<div><span class="t-lines"><span><span class="t-mark-rev t-since-c95">(C95)</span></span><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> copies a certain amount of wide characters between two non-overlapping arrays <br> <span class="t-mark">(function)</span> </td>
+</tr> <tr class="t-dsc"> <td> <div><a href="memmove" title="c/string/byte/memmove"> <span class="t-lines"><span>memmove</span><span>memmove_s</span></span></a></div>
+<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> moves one buffer to another <br> <span class="t-mark">(function)</span> </td>
+</tr> <tr class="t-dsc"> <td> <div><a href="strcpy" title="c/string/byte/strcpy"> <span class="t-lines"><span>strcpy</span><span>strcpy_s</span></span></a></div>
+<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> copies one string to another <br> <span class="t-mark">(function)</span> </td>
+</tr> <tr class="t-dsc"> <td> <div><a href="strcat" title="c/string/byte/strcat"> <span class="t-lines"><span>strcat</span><span>strcat_s</span></span></a></div>
+<div><span class="t-lines"><span><span class="t-mark-rev t-since-c11">(C11)</span></span></span></div> </td> <td> concatenates two strings <br> <span class="t-mark">(function)</span> </td>
+</tr> </table> <div class="_attribution">
+ <p class="_attribution-p">
+ &copy; cppreference.com<br>Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.<br>
+ <a href="https://en.cppreference.com/w/c/string/byte/memccpy" class="_attribution-link">https://en.cppreference.com/w/c/string/byte/memccpy</a>
+ </p>
+</div>