Concatenar Strings em C
-
Utilizar as funções
strcat
estrcpy
para concatenar strings em C -
Utilize a função
memccpy
para Concatenar Strings em C - 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 <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);
}
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