2 votes

Défaut de segmentation dans la concaténation de chaînes de caractères utilisant des pointeurs

J'essaie de concaténer deux chaînes de caractères stockées dans des pointeurs de caractères, mais je fais quelque chose de mal. Quelqu'un pourrait-il m'indiquer ce que c'est, s'il vous plaît ? En outre, je n'utilise pas de fonctions intégrées à dessein.

int main()
{
    char *a = "abc";
    char *b = "def";
    char *c;

    while(*a != '\0')
    {
        *c = *a;
        a++;
        c++;
    }

    while(*b != '\0')
    {
        *c = *b;
        b++;
        c++;
    }

    *c = '\0';
    c -= 6;

    while(*c!= '\0')
    {
        printf("%c", *c);
        c++;
    }

    return 0;

}

4voto

Steve Points 1752

Vous n'avez pas alloué de mémoire pour c

b y c obtenir de la mémoire allouée statiquement, quand vous le faites :

char *a = "abc";
char *b = "def";

Mais c n'a pas cela, donc vous devez allouer de la mémoire en utilisant quelque chose comme :

char *c = malloc (x);

donde x est la longueur totale du tableau de caractères dont vous auriez besoin pour accueillir les caractères que vous souhaitez insérer (plus 1, pour le NULL de fin). Vous devez également vous souvenir de free () à un moment ou à un autre.

Comme vous ne faites pas d'allocation, cette ligne :

*c = *a;

produira un comportement non défini.

2voto

usr Points 13665

c n'est pas initialisé. Vous devez l'initialiser avant de copier des valeurs. Par exemple :

char *c = malloc(strlen(a) + strlen(b) + 1); /* plus 1 for terminating null byte */
if (!c) {
    perror("malloc");
    exit(EXIT_FAILURE);
}

L'autre problème est que vous n'incrémentez pas c lorsque vous imprimez :

   while(*c!= '\0')
    {
        printf("%c", *c);
        c++;
    }

Notez que cette déclaration

c -= 6;

est bien ici mais pas très lisible. Il est préférable d'utiliser un pointeur temporaire pour sauvegarder la position initiale de la fonction c pour que vous n'ayez pas à le faire.

Si vous ne pouvez pas utiliser la norme strlen il est facile de l'implémenter soi-même.

2voto

Mr.C64 Points 11681
char *c;

Avec cette ligne, vous définissez une variable c qui est un pointeur vers un char . Il est clair que votre idée est d'y stocker la concaténation des chaînes. a y b mais, pour ce faire, vous devez avoir un certain mémoire disponible pour le résultat 'a+b' (concaténation) chaîne de caractères.

Ce qu'il faut faire, c'est allouer suffisamment de mémoire pour la chaîne de destination, compter les caractères des deux chaînes sources à concaténer, plus la terminaison NUL ( \0 ). Dans votre cas, vous avez besoin 3 + 3 + 1 = 7 char pour la chaîne de résultats.

Vous pouvez soit les allouer sur la pile, comme ceci :

char result[7];

Ou allouer dynamiquement en utilisant malloc() . Dans ce cas, vous devez également libérer la mémoire en invoquant l'opération suivante free() .

0voto

Foxtrot Points 1

Vous obtenez l'erreur parce que le pointeur c n'est pas initialisé.

int main()
{
char *a = "abc";
char *b = "def";
char x ;
char *c = &x; //initializing pointer

while(*a != '\0')
{
    *c = *a;
    a++;
    c++;
}

while(*b != '\0')
{
    *c = *b;
    b++;
    c++;
}

*c = '\0';
c -= 6;

while(*c!= '\0')
{
    printf("%c", *c++);//increment pointer
}
return 0;

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X