Concatenar Strings em C

  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

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 <string.h>
#include <stdlib.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 <string.h>
#include <stdlib.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 <string.h>
#include <stdlib.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);
}

Artigo relacionado - C String

  • Obter Substring em C
  • Obter um Substring em C