Concatenar cadenas en C
-
Usa las funciones
strcat
ystrcpy
para concatenar cadenas en C -
Utilizar la función
memccpy
para concatenar cadenas en C - Usar la función definida por el usuario para concatenar cadenas literales en C
Este artículo explicará varios métodos de cómo concatenar cadenas en C.
Usa las funciones strcat
y strcpy
para concatenar cadenas en C
La función strcat
es parte de las facilidades para cadenas de la biblioteca estándar de C definidas en la cabecera <string.h>
. La función toma dos argumentos char*
y añade la cadena almacenada en el segundo puntero a la del primer puntero. Dado que las cadenas de estilo C terminan con el carácter \0
, strcat
comienza a añadir la cadena de destino a partir del carácter nulo. Finalmente, el final de la cadena recién construida termina con el carácter \0
. Observe que el programador es responsable de asignar una memoria lo suficientemente grande en el puntero de destino para almacenar ambas cadenas.
La segunda función que se utilizará en esta solución es strcpy
, que de forma similar toma dos parámetros char*
y copia la cadena en el segundo puntero al primer puntero. Tenga en cuenta que strcpy
se utiliza para copiar la primera cadena en el búfer char
designado y luego pasar el puntero de destino a la función strcat
.
Ambas funciones devuelven el puntero a la cadena de destino, y eso hace posible el encadenamiento de llamadas.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
int main() {
const char* str1 = "hello there 1";
const char* str2 = "hello there 2";
char buffer[MAX];
strcat(strcpy(buffer, str1), str2);
printf("%s\n", buffer);
char buffer2[MAX];
strcat(strcpy(buffer2, "Hello there, "), "Josh");
strcat(buffer2, "!\nTemporary...");
printf("%s\n", buffer2);
exit(EXIT_SUCCESS);
}
Producción :
hello there 1hello there 2
Hello there, Josh!
Temporary...
Utilizar la función memccpy
para concatenar cadenas en C
El mayor inconveniente del método anterior es su ineficiente implementación, que realiza iteraciones redundantes sobre la primera cadena almacenada por la función strcpy
.
Por otro lado, memccpy
corrige este problema y procesa ambas cadenas de forma eficiente. La función memccpy
no copia más que el número de bytes especificado por el usuario desde el puntero char*
de origen al de destino, deteniéndose únicamente cuando el carácter dado se encuentra en la cadena de origen. El programa memccpy
devuelve el puntero al último carácter almacenado en el buffer de destino. Así, se pueden encadenar dos llamadas a memccpy
de forma similar al método anterior. La primera cadena se copia en el buffer preasignado por el usuario, y la segunda cadena se añade al puntero devuelto por la primera llamada a memccpy
.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
int main() {
const char* str1 = "hello there 1";
const char* str2 = "hello there 2";
char buffer[MAX];
memccpy(memccpy(buffer, str1, '\0', MAX) - 1, str2, '\0', MAX);
exit(EXIT_SUCCESS);
}
Producción :
hello there 1hello there 2
Usar la función definida por el usuario para concatenar cadenas literales en C
Alternativamente, si memccpy
no está disponible en su plataforma, puede definir una función personalizada que implemente la misma rutina. concatStrings
es la implementación de ejemplo que copia los caracteres de un puntero a otro hasta encontrar el carácter especificado. Observe que especificamos el byte nulo \0
como el carácter a detener en ambos ejemplos.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef MAX
#define MAX 100
#endif
void* concatStrings(void* restrict dst, const void* restrict src, int c,
size_t n) {
const char* s = src;
for (char* ret = dst; n; ++ret, ++s, --n) {
*ret = *s;
if ((unsigned char)*ret == (unsigned char)c) return ret + 1;
}
return 0;
}
int main() {
const char* str1 = "hello there 1";
const char* str2 = "hello there 2";
char buffer[MAX];
concatStrings(concatStrings(buffer, str1, '\0', MAX) - 1, str2, '\0', MAX);
printf("%s\n", buffer);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook