Concatenar cadenas en C

Jinku Hu 12 octubre 2023
  1. Usa las funciones strcat y strcpy para concatenar cadenas en C
  2. Utilizar la función memccpy para concatenar cadenas en C
  3. Usar la función definida por el usuario para concatenar cadenas literales en C
Concatenar cadenas 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);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C String