Concatenar Strings em C

Jinku Hu 12 outubro 2023
  1. Utilizar as funções strcat e strcpy para concatenar strings em C
  2. Utilize a função memccpy para Concatenar Strings em C
  3. Utilizar a Função Definida Personalizada para Concatenar Literais de String em C
Concatenar Strings em C

Este artigo explicará vários métodos de como concatenar strings em C.

Utilizar as funções strcat e strcpy para concatenar strings em C

O strcat faz parte das instalações da string da biblioteca padrão C definida no cabeçalho <string.h>. A função toma dois argumentos char* e anexa a string armazenada no segundo ponteiro ao primeiro ponteiro. Uma vez que as strings ao estilo C terminam com o carácter \0, o strcat começa a anexar à string de destino a partir do caracter nulo. Finalmente, o fim de uma string recém-construída termina com o caractere \0. Note-se que o programador é responsável pela atribuição da memória suficientemente grande no ponteiro de destino para armazenar ambas as strings.

A segunda função a ser utilizada nesta solução é strcpy, que de igual modo toma dois parâmetros char* e copia a string no segundo ponteiro para o primeiro ponteiro. Note-se que a strcpy é utilizada para copiar a primeira string para o buffer designado char e depois passar o ponteiro de destino para a função strcat.

Ambas as funções devolvem o ponteiro à string de destino, e isso torna possível as chamadas de encadeamento.

#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);
}

Resultado:

hello there 1hello there 2
Hello there, Josh!
Temporary...

Utilize a função memccpy para Concatenar Strings em C

A maior desvantagem do método anterior é a sua implementação ineficiente que faz iterações redundantes sobre a primeira string armazenada pela função strcpy.

A memccpy, por outro lado, corrige esta questão e processa ambas as strings de forma eficiente. A memccpy não copia mais do que o número especificado pelo utilizador de bytes da fonte char* para o ponteiro de destino apenas parando quando o carácter dado é encontrado na string da fonte. A memccpy devolve o ponteiro ao último caracter armazenado no buffer de destino. Assim, duas chamadas memccpy podem ser acorrentadas de forma semelhante ao método anterior. A primeira string é copiada para o buffer pré-alocado pelo utilizador, e a segunda string é anexada ao ponteiro retornado da primeira chamada para 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);
}

Resultado:

hello there 1hello there 2

Utilizar a Função Definida Personalizada para Concatenar Literais de String em C

Em alternativa, se a memccpy não estiver disponível na sua plataforma, pode definir uma função personalizada implementando a mesma rotina. A concatStrings é a implementação de exemplo que copia os caracteres de um ponteiro para outro até que o carácter especificado seja encontrado. Note que especificamos o byte nulo \0 como o caracter a parar em ambos os exemplos.

#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

Artigo relacionado - C String