Saltar al contenido

strcat Vs strncat: ¿cuándo se debe usar qué función?

Si te encuentras con alguna parte que no comprendes puedes comentarlo y haremos todo lo necesario de ayudarte lo más rápido posible.

Solución:

Concatenar dos cadenas en una sola string.

prototipos

#include 

char * strcat(char *restrict s1, const char *restrict s2);

char * strncat(char *restrict s1, const char *restrict s2, size_t n);

DESCRIPCIÓN

los strcat() y strncat() funciones adjuntar una copia de la null-terminado
string s2 hasta el final de la null-terminado string s1, luego agregue un ’ de terminación. los string s1 debe tener espacio suficiente para contener el resultado.

La función strncat() agrega no más de n caracteres de s2 y luego agrega un ’ de terminación.

Las cadenas de origen y destino no deben superponerse, ya que el comportamiento no está definido.

VALORES DEVUELTOS

 The `strcat()` and `strncat()` functions return the pointer s1.

CONSIDERACIONES DE SEGURIDAD

los strcat() La función se utiliza fácilmente de manera indebida de una manera que permite a los usuarios maliciosos cambiar arbitrariamente la funcionalidad de un programa en ejecución a través de un ataque de desbordamiento de búfer.

Evitar el uso de strcat(). En su lugar, utiliza strncat() o strlcat() y asegúrese de que no se copien más caracteres en el búfer de destino de los que puede contener.

Tenga en cuenta que strncat() también puede ser problemático. Puede ser un problema de seguridad para un string para ser truncado en absoluto. Desde el truncado string
no será tan largo como el original, puede hacer referencia a un recurso completamente diferente y el uso del recurso truncado podría dar como resultado un comportamiento muy incorrecto. Ejemplo:

void
 foo(const char *arbitrary_string)
 
         char onstack[8] = "";

 #if defined(BAD)
         /*
          * This first strcat is bad behavior.  Do not use strcat!
          */
         (void)strcat(onstack, arbitrary_string);        /* BAD! */
 #elif defined(BETTER)
         /*
          * The following two lines demonstrate better use of
          * strncat().
          */
         (void)strncat(onstack, arbitrary_string,
             sizeof(onstack) - strlen(onstack) - 1);
 #elif defined(BEST)
         /*
          * These lines are even more robust due to testing for
          * truncation.
          */
         if (strlen(arbitrary_string) + 1 >
             sizeof(onstack) - strlen(onstack))
                 err(1, "onstack would be truncated");
         (void)strncat(onstack, arbitrary_string,
             sizeof(onstack) - strlen(onstack) - 1);
 #endif
 

Ejemplo

char dest[20] = "Hello";
char *src = ", World!";
char numbers[] = "12345678";

printf("dest before strcat: "%s"n", dest); // "Hello"

strcat(dest, src);
printf("dest after strcat:  "%s"n", dest); // "Hello, World!"

strncat(dest, numbers, 3); // strcat first 3 chars of numbers
printf("dest after strncat: "%s"n", dest); // "Hello, World!123"

Si está absolutamente seguro del tamaño del búfer de origen y de que el búfer de origen contiene un carácter NULL que termina el stringentonces puede usar strcat de manera segura cuando el búfer de destino es lo suficientemente grande.

Todavía recomiendo usar strncat y darle el tamaño del búfer de destino – longitud del destino string – 1

Nota: edité esto porque los comentarios señalaron que mi respuesta anterior estaba terriblemente equivocada.

Si te gusta la invitación, eres capaz de dejar un artículo acerca de qué le añadirías a esta noticia.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *