Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

#1 Le 10/10/2017, à 10:36

plouf1221

[RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu

Bonjour les ubuntiens,

Voila j'ai un petit souci et je ne comprends pas vraiment d’où il vient.
Je souhaite simplement afficher deux fois la même chaîne de caractere.
La première fois je n'ai aucun souci.
Mais la deuxième rien ne s'affiche pourtant je réinitialise bien mon pointeur en début de chaîne
et je réécris exactement le même bout de code.
Es ce que quelqu'un à une explication ?

#include <stdio.h>                                     
#include <stdlib.h>

int main(void)
{
        char* tableau[] = {"premier", "deuxieme"};
        char** p = tableau;

        // Affichage de la deuxieme chaine de caractere
        while (*p[1] != '\0')
        {
                printf("%c", *p[1]);
                (p[1])++;
        }

        printf("\n");

        // Réinitialisation du pointeur
        p = tableau;

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

        printf("\n");
        return EXIT_SUCCESS;
}
                                                       

Merci pour votre aide.

Dernière modification par plouf1221 (Le 10/10/2017, à 19:01)

Hors ligne

#2 Le 10/10/2017, à 11:17

pingouinux

Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu

Bonjour,
Pour imprimer 2 fois la seconde chaîne :

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        char* tableau[] = {"premier", "deuxieme"};
        char** p = tableau;
        char* p1_init = p[1];                          // Ligne ajoutée

        // Affichage de la deuxieme chaine de caractere
        while (*p[1] != '\0')
        {
                printf("%c", *p[1]);
                (p[1])++;
        }

        printf("\n");

        // Réinitialisation du pointeur
   //   p = tableau;
        p[1]=p1_init;                                  // Ligne modifiée

        while (*p[1] != '\0')
        {
   //           printf("%c", *p[0]);
                printf("%c", *p[1]);                   // Ligne modifiée
                (p[1])++;
        }

        printf("\n");
        return EXIT_SUCCESS;
}

Hors ligne

#3 Le 10/10/2017, à 17:06

plouf1221

Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu

Mais lorsque je réinitialise le pointeur p avec la ligne suivante :
p = tableau;

C'est le même pointeur que p[1] puisque p[1] = *(p+1).
Je ne comprends pas pourquoi je suis obligé de prendre une nouvelle variable comme tu as fait pinguinux,
c'est à dire :
p[1] = p1_init;

Normalement si je réinitialise le pointeur p je réinitialise également p[1] puisque c'est le même pointeur.
Je ne comprends pas.

Dernière modification par plouf1221 (Le 10/10/2017, à 17:06)

Hors ligne

#4 Le 10/10/2017, à 17:41

pingouinux

Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu

Avant la première boucle, tableau (et p) sont l'adresse du début d'un tableau à 2 éléments (les adresses de début des 2 chaînes de caractères).
Dans la première boucle, tu modifies p[1], qui va pointer successivement sur les caractères successifs de la second chaîne. Ni tableau ni p ne sont modifiés.
La seconde boucle n'est jamais parcourue, car p[1] pointe sur le caractère nul de la seconde chaîne.

Tu pourrais aussi faire ceci :

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        char* tableau[] = {"premier", "deuxieme"};
        char* p = tableau[1];

        // Affichage de la deuxieme chaine de caractere
        while (*p != '\0') { printf("%c", *p++); }

        printf("\n");

        // Réinitialisation du pointeur
        p = tableau[1];

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

        printf("\n");
        return EXIT_SUCCESS;
}

Si tu veux en avoir le cœur net, tu peux imprimer les pointeurs à différents endroits du programme.

        printf("p=%p tableau=%p\n",p,tableau);
        printf("p[0]=%p p[1]=%p *p[0]=%02x *p[1]=%02x\n",p[0],p[1],*p[0],*p[1]);

Hors ligne

#5 Le 10/10/2017, à 18:09

plouf1221

Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu

pinguinux a écrit :

Dans la première boucle, tu modifies p[1], qui va pointer successivement sur les caractères successifs de la second chaîne. Ni tableau ni p ne sont modifiés.

C'est exaxtement cela que je ne comprends pas, je ne comprends pas comment c'est possible,
puisque p[1] = *(p+1)
Donc si je modifie p[1] je modifie forcément p et inversement.
Il n'y a bien qu'un seul pointeur.

Hors ligne

#6 Le 10/10/2017, à 18:37

pingouinux

Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu

p est un pointeur sur un tableau de 2 éléments, qui sont eux-mêmes des pointeurs : p[0] et p[1] (ou *p et *(p+1)). Tu modifies le second élément de ce tableau, mais ne change pas le tableau lui-même.

Si tu as un tableau i de 2 entiers, et que tu modifies i[1], l'adresse de i ne change pas.

int i[]={10,20};

Hors ligne

#7 Le 10/10/2017, à 19:00

plouf1221

Re : [RESOLU]Deux fois l'affichage de la chaine de caractere via un pointeu

C'est bon j'ai compris merci pinguinux.
Je modifie le pointeur p[1] via la ligne p[1]++;
Ensuite je suis sur le caractere de fin de chaine c'est pour cela que je n'arrive pas à imprimer deux fois.
Je suis obligé de stocké la position de mon pointeur celui qui est dans le tableau sans toucher à l'adresse du tableau.
C'est clair pour moi, merci encore.

Hors ligne