Pergunta
Eu tentei implementar o strcat sozinho e encontrei a implementação do STRCAT de Wiki Assim ...... Mas quando eu o uso, há falha de segmentação.
O que há de errado com o código abaixo?
char *
strcat(char *dest, const char *src)
{
size_t i,j;
for (i = 0; dest[i] != '\0'; i++)
;
for (j = 0; src[j] != '\0'; j++)
dest[i+j] = src[j];
dest[i+j] = '\0';
return dest;
}
Solução
O código está bem.
Parece que você tem um problema no código de chamada.
Você se lembra de alocar memória suficiente para a string de destino?
Outras dicas
Eu sugeriria fortemente o uso de ponteiros em vez de índices inteiros, por medo de transbordar inteiro. Ainda que size_t
é o mesmo número de bits que char *
, você é adicionando índices onde você não estaria adicionando ponteiros.
Eu acho que isso é mais ou menos acadêmico; Se você está ligando strcat()
Em cordas de vários gigabytes, você provavelmente está com todo tipo de problema.
Aqui está uma versão baseada em ponteiro, por completude ':
char *
my_strcat(char *dest, const char *src)
{
char *rdest = dest;
while (*dest)
dest++;
while (*dest++ = *src++)
;
return rdest;
}
Claro, isso leva o valor de outro ponteiro para o espaço para o rdest
Valor de retorno, mas acho que é uma boa troca.
Observe também que você não pode definir legalmente uma função chamada strcat()
no código de aplicação comum; todo esse espaço para nome (funções públicas com nomes começando com str
) é reservado para a implementação.
Dest precisa ter memória suficiente para acomodar a concatenação nesta implementação. Nesta implementação, teria que ser alocado pelo chamador. Você também deve ter certeza de que o destin e o SRC são encerrados nulos. Se o Dest não tiver memória suficiente, isso substituirá a memória que poderá ser usada por outra coisa.
Está funcionando bem comigo, eu verifiquei.
#include "stdio.h"
char *strcat(char *dest, const char *src)
{
size_t i,j;
for (i = 0; dest[i] != '\0'; i++)
;
for (j = 0; src[j] != '\0'; j++)
dest[i+j] = src[j];
dest[i+j] = '\0';
return dest;
}
void main(void)
{
char a[10]={"abc"}, b[10]={"def"};
strcat(a,b);
printf("%s",a);
getchar();
}
Alocar memória suficiente para a string de destino .. ou seja, pelo menos (comprimento da string de origem + 1).