memccpy
|
Definido en el encabezado
<string.h>
|
||
|
void
*
memccpy
(
void
*
restrict
dest,
const
void
*
restrict
src,
int
c,
size_t
count
)
;
|
(desde C23) | |
Copia bytes desde el objeto apuntado por src al objeto apuntado por dest , deteniéndose después de que cualquiera de las siguientes dos condiciones se cumpla:
-
- count bytes son copiados
- el byte ( unsigned char ) c es encontrado (y copiado).
Los objetos src y dest se interpretan como arreglos de unsigned char .
El comportamiento es indefinido si alguna condición se cumple:
-
- el acceso ocurre más allá del final del arreglo dest ;
- los objetos se superponen (lo cual viola el contrato de restrict )
- ya sea que dest o src sea un puntero inválido o nulo
Contenidos |
Parámetros
| dest | - | puntero al objeto a copiar |
| src | - | puntero al objeto desde el cual copiar |
| c | - | byte de terminación, convertido primero a unsigned char |
| count | - | número de bytes a copiar |
Valor de retorno
Si se encontró el byte
(
unsigned
char
)
c
,
memccpy
devuelve un puntero al siguiente byte en
dest
después de
(
unsigned
char
)
c
. De lo contrario, devuelve un puntero nulo.
Notas
La función es idéntica a la
POSIX
memccpy
.
memccpy
(
dest, src,
0
, count
)
se comporta de manera similar a
strncpy
(
dest, src, count
)
, excepto que la primera devuelve un puntero al
final
del búfer escrito, y no rellena con ceros el array de destino. Por lo tanto,
memccpy
es útil para concatenar múltiples cadenas de manera eficiente.
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
Ejemplo
#include <ctype.h> #include <stdio.h> #include <string.h> 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."); }
Salida:
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
Véase también
|
(C11)
|
copia un búfer a otro
(función) |
|
(C95)
(C11)
|
copia cierta cantidad de caracteres anchos entre dos arreglos que no se superponen
(función) |
|
(C11)
|
mueve un búfer a otro
(función) |
|
(C11)
|
copia una cadena a otra
(función) |
|
(C11)
|
concatena dos cadenas
(función) |