strncpy_s strncat funciona como c string

strncat - strncpy en c



¿Cuándo usar strncpy o memmove? (6)

(gcc 4.4.4 c89)

Siempre he usado strncpy para copiar cadenas. Nunca he usado realmente memmove o memcpy mucho. Sin embargo, me pregunto ¿cuándo decidiría usar strncpy , memmove o memcpy ?

El código que estoy escribiendo es para una aplicación cliente / servidor. En la documentación se utiliza bcopy . Sin embargo, ¿podría hacer lo mismo con los demás?

bcopy((char*)server->h_addr, (char*)&serv_addr.sin_addr.s_addr, server->h_length);

Muchas gracias,


Nunca debe usar strncpy (a menos que esté lidiando con esa rara situación específica para la que se introdujo). La función no está diseñada para usarse con cadenas en C terminadas en cero. El nombre que se le da a esa función es solo un error histórico, y resulta ser la principal fuente de confusión para las personas que intentan usarlo. strncpy es una función introducida para admitir las llamadas cadenas de "ancho fijo", no cadenas terminadas en cero. El uso de strncpy con cadenas terminadas en cero es una mala práctica de programación, a pesar de que puede hacer que se parezca al "trabajo" para ese propósito.

No existe una función para la copia de cadena "segura" de longitud limitada en la biblioteca C, sin embargo, algunas implementaciones la proporcionan bajo el nombre strlcpy , que ya se convirtió en un nombre estándar de facto para esta función. Si su implementación no proporciona strlcpy , implementelo usted mismo.

Además, es cierto que en muchos casos puede reemplazar la función str... con las funciones mem... , es decir, cuando conoce el número exacto de caracteres para copiar.


Si está buscando una forma segura / rápida de copiar, estoy contento con la siguiente técnica:

memcpy( dest, src, sizeof (dest)); dest[sizeof(dest) - 1] = ''/0''; // ensure null termination

Menos eficiente, pero también funciona para limitar los bytes escritos y terminar en nulo la cadena:

sprintf( dest, sizeof (dest), "%s", src);

También devuelve el número de bytes que habría escrito, por lo que puede saber si se realizó el truncamiento.


Si no necesita el comportamiento de llenado de búfer de strncpy pero desea la seguridad de no desbordar el búfer, considere strlcpy

De wikipedia :

strlcpy ofrece dos características que están diseñadas para ayudar a los desarrolladores de software a evitar problemas. La función toma el tamaño del destino como parámetro, evitando los desbordamientos del búfer si el parámetro de tamaño es correcto. Si este tamaño es mayor que cero, siempre se escribe un byte nulo en el destino, por lo que la cadena resultante siempre termina en nulo (incluso si la cadena de origen se truncó para ajustarse).


Use strncpy () solo si sabe que hay suficiente espacio para la cadena, ya que no garantiza la terminación nula, y es demasiado entusiasta si el destino es mucho más corto que la cadena de origen (porque anula la cadena a toda su longitud). Y si sabes la longitud, puedes usar memmove() ...

Si conoce la longitud de las cadenas, memmove() es una opción sensata, y nominalmente más rápida que strncpy() porque no tiene que verificar los nulos a medida que avanza; sólo copia el número relevante de bytes. (Supongo que memcpy() no existe, ya que puede fallar si las áreas de origen y destino de la memoria se superponen, mientras que memmove() funcionará correctamente a pesar de todo).

Piense en bcopy() como una variante arcaica de las funciones mem*() .


strcpy (y otros métodos str *) se detienen cuando encuentran un byte NULL (0). memcpy y las funciones relacionadas NO se detienen cuando encuentran un byte NULO.

Si tienes datos binarios, debes usar memcpy. En su ejemplo, está copiando datos binarios, no datos de cadena.

strncpy es un caso especial en el que dejará de copiar en un byte NULL, pero aún así continuará rellenando la salida con NULL hasta la longitud especificada.


strncpy() se usa para copiar datos de una fuente a un destino de un tamaño establecido, copiando (relleno) 0x00 s si se encuentra un byte 0x00 en la matriz de origen (cadena) antes del final del búfer. A diferencia de strcpy que se copiará felizmente para siempre hasta que se encuentre un byte 0 , incluso si dicho byte está más allá de su búfer.

memcpy() se utiliza para copiar desde el origen al destino sin importar lo que contengan los datos del origen. También tiende a estar muy optimizado para el hardware y, a menudo, leerá las palabras del sistema ( int s / long s) a la vez para acelerar la copia cuando la alineación lo permita.

memmove() se utiliza para copiar desde un área de origen y destino superpuestas (por ejemplo, mover el contenido de una matriz alrededor de sí mismo o algo similar, de ahí el mnemónico de movimiento). Utiliza estrategias (como la posibilidad de copiar datos desde la parte posterior en lugar de la parte frontal) para protegerse contra los problemas causados ​​por la superposición de regiones. También puede ser un poco menos eficiente, ya que por lo general no hay mucha ayuda de hardware para copiar datos de atrás hacia adelante.

bcopy() y sus parientes ( bzero y algunos otros) es una función de copia de bytes que he visto de vez en cuando en tierra incrustada. Por lo general, copia los datos un byte a la vez desde el origen hasta el destino para evitar problemas de dirección de memoria mal alineados, aunque cualquier buen memcpy manejará esto, por lo que su uso suele ser sospechoso.

¡Buena suerte!