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;
}
Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top