Después de saber que strncmp
no es lo que parece y strlcpy
no está disponible en mi sistema operativo (Linux), pensé que podría intentarlo y escribirlo yo mismo.C extraño comportamiento de matriz
Encontré una cita de Ulrich Drepper, el mantenedor libc, que publicó una alternativa al strlcpy
usando mempcpy
. Tampoco tengo mempcpy
, pero su comportamiento fue fácil de replicar. En primer lugar, este es el caso de prueba que tiene
#include <stdio.h>
#include <string.h>
#define BSIZE 10
void insp(const char* s, int n)
{
int i;
for (i = 0; i < n; i++)
printf("%c ", s[i]);
printf("\n");
for (i = 0; i < n; i++)
printf("%02X ", s[i]);
printf("\n");
return;
}
int copy_string(char *dest, const char *src, int n)
{
int r = strlen(memcpy(dest, src, n-1));
dest[r] = 0;
return r;
}
int main()
{
char b[BSIZE];
memset(b, 0, BSIZE);
printf("Buffer size is %d", BSIZE);
insp(b, BSIZE);
printf("\nFirst copy:\n");
copy_string(b, "First", BSIZE);
insp(b, BSIZE);
printf("b = '%s'\n", b);
printf("\nSecond copy:\n");
copy_string(b, "Second", BSIZE);
insp(b, BSIZE);
printf("b = '%s'\n", b);
return 0;
}
Y este es el resultado:
Buffer size is 10
00 00 00 00 00 00 00 00 00 00
First copy:
F i r s t b =
46 69 72 73 74 00 62 20 3D 00
b = 'First'
Second copy:
S e c o n d
53 65 63 6F 6E 64 00 00 01 00
b = 'Second'
Se puede ver en la representación interna (las líneas insp()
creados) que hay algo de ruido mezclado, como la cadena de formato printf()
en la inspección después de la primera copia, y una 0x01 extranjera en la segunda copia.
Las cadenas se copian intactas y manejan correctamente cadenas fuente demasiado largas (ignoremos el posible problema con pasar 0 como longitud a copy_string
por ahora, lo arreglaré más adelante).
¿Pero por qué hay contenidos de matrices foráneas (a partir de la cadena de formato) dentro de mi destino? Es como si el destino en realidad se hubiera REDIMTADO para coincidir con la nueva longitud.
¿Qué es un conjunto extraño? – WhirlWind
En este caso me refiero a la cadena literal de printf, es decir, "b = '% s'", que se "entremezcló" con mi matriz "b", el destino – LukeN
Tenga en cuenta que la fuente de 'strlcpy()' y 'strlcat () 'está bastante disponible bajo una licencia liberal: http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/lib/libc/string/strlcpy.c?content-type=text%2Fplain –