Escribir función strlcpy

stell-91 Mensajes publicados 519 Fecha de registro   Estado Miembro Última intervención   -  
 n -
Hola,

Debo escribir strlcpy en C, tengo dificultades para entender el man y lo he leído varias veces.

Te explico primero lo que he entendido, dime si no estás de acuerdo conmigo.

man strcpy
Toma 2 parámetros, debemos copiar src en dest y luego agregar un '\0' y retornar dest.
Si dest es más corto que src, entonces retornamos los x caracteres de src copiados en dest.

man strncpy
Toma 3 parámetros, debemos copiar los n primeros caracteres de src en dest y luego agregar '\0' si es necesario cuando dest es más largo que src.

man strlcpy (se complica un poco)
Toma 3 parámetros (char *dest, char *src, unsigned int size)
Retorna la longitud que se puede copiar de src en dest.
En paralelo, hay que copiar size - 1 caracteres de src en dest y poner un '\0' al final. La longitud retornada será igual al número de caracteres que incluye el '\0'.
¿Qué debemos retornar si dest es más corto que src, qué debemos copiar en dest?

Gracias por tu ayuda

https://www.freebsd.org/cgi/man.cgi?query=strlcpy&sektion=3

http://manpagesfr.free.fr/man/man3/strcpy.3.html

Configuración: Windows / Chrome 62.0.3202.89

2 respuestas

flagch Mensajes publicados 1 Estado Miembro 2
 
Hola amigos,

No he profundizado en la cuestión en sí, especialmente porque hace al menos quince años que no he hecho de C...

Me permito solo una observación ya que vuestros intercambios son bastante sintomáticos de un problema recurrente que se presenta con más y más agudeza: la absoluta necesidad de dominar el lenguaje - hablo bien del idioma (el francés, en este caso) y no de un lenguaje informático - para resolver problemas más o menos complejos. Sin lenguaje, el pensamiento es imposible, y viceversa. Por lo tanto, se vuelve complicado comunicarse cuando no se es capaz de expresar el propio pensamiento de manera clara.

Igualmente importante que saber poner palabras a lo que pensamos, es la absoluta necesidad de comprender un texto leído (o escuchado). La mejor documentación técnica no vale nada si no se es capaz de captar las matices del lenguaje.

Si queremos transmitir ideas, es indispensable poseer algunas bases lingüísticas como por ejemplo:
- un mínimo de vocabulario raramente perjudica
- algunas nociones vagas de gramática pueden ayudar ocasionalmente
- la PUNTUACIÓN: a menudo descuidada pero, ¡cuán importante es! Mal (o no) utilizada, la puntuación convierte un texto en tan ilegible como una función matemática en la que se hubieran mezclado aleatoriamente los operadores.

Siendo yo mismo desarrollador, pero también y sobre todo amante del idioma (particularmente del mío: el francés), me he enfrentado mil veces a colegas incapaces de enunciar en francés un problema simple desde el punto de vista lógico o matemático. Resultado: nos encontramos invariablemente en un callejón sin salida. Se puede ser un genio, pero, sin poder explicar claramente nuestro hallazgo, somos incapaces de transmitirlo. No es necesario ser informático tampoco para ver los daños que provoca nuestro escaso dominio del lenguaje: ¿quién no ha experimentado un SMS mal interpretado por culpa de una huelga de la coma? La coma es, según yo, una de las primeras causas de divorcio en nuestros días.

Y ni siquiera hablo del punto suspensivo... que se ha... convertido con la llegada (¿advenimiento para los puristas?) del lenguaje SMS... en una verdadera calamidad de... nuestro... tiempo. ¿Qué hay de más simple, de hecho, que pulsar tres veces esta tecla PUNTO para modificar completamente el sentido de lo que precede?

No sé realmente por qué comencé a redactar este post, especialmente porque no aporta mucho a la cuestión inicial :))))
Solo era para llamar la atención del lector sobre la importancia de aprender francés, y no solo la ortografía sino sobre todo la gramática, y particularmente la sintaxis. Es esencial. ¡Primordial!
Quizá también para vengarme amablemente de mis colegas que casi me tomaban por un "teubé" cuando les decía que lo que me decían o me escribían sobre todo simplemente no era lógico, no era francés.

Bueno; dejo aquí la esperanza de no haber cometido demasiados errores que prometen ser preocupantes al redactar este laíus, si no, ya veis, el aire da en que nos nomina? :)
3
n
 
Voté "gracias" por error.
1
Dalfab Mensajes publicados 638 Fecha de registro   Estado Miembro Última intervención   102
 
Hola,
¡Encuentro que el man es más claro que tus explicaciones!

strlcpy(dest,src,lgMax)
debe copiar la mayor cantidad de caracteres posible de
src
en
dest
, el tamaño máximo en
dest
es
lgMax
.
A diferencia de
strncpy(dest,src,lgMax)
, debe garantizar que el terminador se escriba siempre en
dest[]
(si
src
es demasiado larga, estará en la posición
dest[lgMax-1]
, de lo contrario
dest
será una simple copia de
src
).
La función debe devolver la longitud de
src
.
1
stell-91 Mensajes publicados 519 Fecha de registro   Estado Miembro Última intervención   5
 
Gracias por tu respuesta, pero tengo miedo de no entender lo que me explicas

¿strlcpy debe devolver la longitud de src? ¿Esto es válido en todos los casos?

Si dest es más largo que src, ¿debo devolver la longitud de src?
Si dest es más corto que src, ¿debo devolver la longitud de src?
0
Dalfab Mensajes publicados 638 Fecha de registro   Estado Miembro Última intervención   102 > stell-91 Mensajes publicados 519 Fecha de registro   Estado Miembro Última intervención  
 



Esto permite que el uso de la función sepa que toda la cadena ha sido copiada
char dest[5]; int nb = strlcpy(dest, "hello", sizeof(dest)); nb -= sizeof(dest) - 1; if ( nb > 0 ) printf("atención faltan %d caracteres\n" , nb); printf("cadena = %s\n" , dest); // => "hell"
0
stell-91 Mensajes publicados 519 Fecha de registro   Estado Miembro Última intervención   5
 
Quiero asegurarme de haber entendido bien

ejemplo
dest = "avión"
src = "barco"
unsigned int size = 3

vamos a copiar src en dest, así que el nuevo dest = "ba\0\0\0\0"
¿Estás de acuerdo con la idea de añadir suficientes '\0'?

valor retornado 2 + 1, el 1 corresponde a '\0', ¿lo validas?

Dije 2 + 1 por esta frase en el man que me hizo dudar: "las funciones devuelven la longitud total de la cadena que intentaron crear."

otro caso
dest = "avión"
src = "barco"
unsigned int size = 8

nuevo dest = ""barco"\0
valor retornado 6 + 1, ¿es correcto?

https://www.freebsd.org/cgi/man.cgi?query=strlcpy&sektion=3

¿Estás de acuerdo conmigo?
Si está bien, creo que he entendido la sutileza de esta función.
0
Dalfab Mensajes publicados 638 Fecha de registro   Estado Miembro Última intervención   102 > stell-91 Mensajes publicados 519 Fecha de registro   Estado Miembro Última intervención  
 
Relée el man

ejemplo
dest = "avión"
src = "barco"
unsigned int size = 3

vamos a copiar src en dest, así que el nuevo dest = "ba\0on\0" (máximo 3 caracteres incluido el terminador, los demás no son en absoluto modificados)
¿Estás de acuerdo con la idea de añadir suficientes '\0'?
No, no está en el man.
valor retornado 3 + 1, el 1 corresponde a '\0', ¿validas?
No, retornamos 6, la longitud de "barco" y el '\0' no se cuenta
Dije 3 + 1 por esta frase en el man que me hizo dudar:
"las funciones devuelven la longitud total de la cadena que intentaron crear."
Ciertamente, texto ambiguo, pero el man precisa "Para strlcpy() eso significa la longitud de src."

otro caso

dest = "avión"
src = "barco"
unsigned int size = 8

nuevo dest = "barco"\0 Sí
valor retornado 6 + 1, ¿es eso? No 6
0
stell-91 Mensajes publicados 519 Fecha de registro   Estado Miembro Última intervención   5 > Dalfab Mensajes publicados 638 Fecha de registro   Estado Miembro Última intervención  
 
"vamos a copiar src en dest así que el nuevo dest = "ba\0on\0" (máx 3 caracteres incluido el terminador, los otros no se modifican en absoluto)
¿Estás de acuerdo con la idea de añadir suficiente '\0'?
No, no está en el man."


Sí, perdona, hice un atajo torcido con la función strncpy. Hay que añadir un solo '\0'

Para el valor retornado, este corresponde al valor de src. Recuerdo que src nunca se modifica, así que su longitud permanece sin cambios, solo dest es modificado.

Si validas mis explicaciones creo que he entendido.
0