Question

J'ai essayé de mettre en œuvre le strcat par moi-même, et je trouve la mise en œuvre de strcat de Wiki comme ce ...... mais quand je l'utilise, il y a erreur de segmentation.

Quel est le problème avec le code ci-dessous?

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;
}
Était-ce utile?

La solution

le code est correct.

On dirait que vous avez un problème dans le code appelant.

Avez-vous pensé à allouer suffisamment de mémoire pour la chaîne cible?

Autres conseils

Je suggère fortement l'utilisation de pointeurs plutôt que des indices entiers, par crainte de débordement d'entier. Même si size_t est le même nombre de bits que char *, vous êtes ajouter indices où vous ne seriez pas ajouterez des pointeurs.

Je suppose que c'est plus ou moins academical; si vous appelez strcat() sur les chaînes de plusieurs giga-octets, vous êtes probablement dans toutes sortes de problèmes.

Voici une version pointeur, par souci d'exhaustivité:

char *
my_strcat(char *dest, const char *src)
{
    char *rdest = dest;

    while (*dest)
      dest++;
    while (*dest++ = *src++)
      ;
    return rdest;
}

Bien sûr, cela ne prend une autre la valeur de pointeur d'espace pour la valeur de retour de rdest, mais je pense que c'est un beau compromis.

Notez également que vous ne pouvez pas définir légalement une fonction appelée strcat() dans le code d'application ordinaire; cet espace de noms ensemble (fonctions publiques avec des noms commençant par str) est réservée à la mise en œuvre.

dest doit avoir suffisamment de mémoire pour accueillir la concaténation dans cette mise en œuvre. Dans cette mise en œuvre, il devrait être alloué par l'appelant. Vous devez également vérifier que les deux dest et src sont nuls fin. Si dest n'a pas assez de mémoire, cela remplacera la mémoire qui pourrait être utilisé par autre chose.

Son beau travail avec moi, je le vérifier.

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

}

allouer suffisamment de mémoire pour la chaîne de destination .. ie atleast (longueur de chaîne de source + 1).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top