Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Chaine de caract.] Décaler le pointeur

Sujet résolu
    6 février 2006 à 23:14:30

    J'ai une chaine de caractère :
    char Chaine;

    Elle contient une phrase.
    Je fais une recherche pour un mot :
    Resultat = strstr(Chaine, MonMot);

    Donc, Resultat est défini comme ceci :
    char* Resultat;

    Si on l'affiche, il va m'afficher la phrase à partir du mot trouvé.
    Je sais que le mot fait 6 caractères, et je voudrais que le mot ne soit pas affiché. J'ai donc tenté de faire un second pointeur pointant six caractère plus loin.
    char* Resultat2;
    Resultat2=Resultat+6;

    Mais cela ne marche pas : la compilation passe, mais il met un message d'erreur "Erreur de Segmentation".

    Quelqu'un à une idée pour réaliser ceci ?
    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2006 à 23:31:13

      tu peux pas ajouter de nombre normaux , car l'adresse est en hexadecimal et non pas en decimal ..sinon je vois pas comment faire
      • Partager sur Facebook
      • Partager sur Twitter
        7 février 2006 à 0:06:19

        En fait, on peut faire l'addition d'un pointeur avec un nombre normal.
        Dans ce cas, on fait appel aux "pointeurs mobiles"

        Mais là n'est pas le problème ...
        Erreur de segmentation signifie, il me semble, que tu sort de ton char*.
        Tu essayes sûrement d'atteindre une lettre qui n'existe pas.

        Il faudrait voir le programme de plus près.

        Et s'il vous plaît, mettez-vous au C++ !! :p
        • Partager sur Facebook
        • Partager sur Twitter
          7 février 2006 à 0:39:19

          char Chaine;

          Ce n'est pas une chaine de caractère, c'est UN caractère.
          Pour un chaine de caractère, il aurait fallu:

          char Chaine[x];

          où x est le nombre max de caractère + 1. (Pour le \0)
          • Partager sur Facebook
          • Partager sur Twitter
            7 février 2006 à 7:13:59

            Ma chaine contenant la phrase est bien un tableau (char Chaine[];).

            Comment passe t on de la valeur decimale à hexadécimale et inversement.
            Si je sors de ma chaine, n'est-ce pas à cause d'une confusion entre ces deux notations, qui au lieu de décaler de six lettres, décaleraient d'un autre nombre ?

            Ma chaine fait largement plus de 6 caractères (environ 200).
            • Partager sur Facebook
            • Partager sur Twitter
              7 février 2006 à 7:25:50

              Bah hésite surtout pas à nous donner ton code, mais vérifie que le pointeur renvoyé par strstr n'est pas NULL
              • Partager sur Facebook
              • Partager sur Twitter
                7 février 2006 à 9:20:17

                L'histoire de décimal et d'héxadécimal c'est de connerie, l'ordinateur il fait tout en binaire, barre point.

                Sinon, effectivement, si tu pouvais nous montrer tout ton code, et pas de trucs faux (genre mettre "char Chaine;" pour dire ensuite "char Chaine[];" c'est un peu perturbant), ca serait plus simple.
                • Partager sur Facebook
                • Partager sur Twitter
                  7 février 2006 à 12:40:55

                  Avec le peu de code donné, difficile à dire (à priori ça devrait marcher).

                  Essaie de faire plutôt :
                  Resultat2=Resultat+6*sizeof(char);

                  C'est plus politiquement correct on va dire (expliqué plus tard dans le cours). Mais comme à priori la taille d'un char c'est 1, ça ne devrait pas résoudre ton problème.
                  Il nous faut donc le code total.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                    7 février 2006 à 19:59:28

                    Merci pour votre aide, j'ai pu résoudre mon problème par moi-même. Mais j'ai maintenant un autre problème. Pour simplifier le problème, je vais poster le code entier du problème, comme demandé.

                    J'ai fait une fonction qui modifie les chaines passées en paramètres, en fonction du contenu de la première :
                    void DefinirInfos(const char* EMail, char* ServeurPOP, char* ServeurSMTP, char* Identifiant, char* FAI)
                    {
                            // Definition des chaines de recherche :
                            char StrWanadoo[]="wanadoo", StrFree[]="free", StrArobaz[]="@", StrTampon[100];
                            // Un pointeur pour "naviguer" dans l'email.
                            char* PtrTmp1;

                            // Si l'adresse mail contient wanadoo
                            PtrTmp1 = strstr(EMail, StrWanadoo);
                            if (PtrTmp1 != NULL)
                            {
                                    sprintf(FAI,"Wanadoo");
                                    sprintf(ServeurPOP,"pop.wanadoo.fr");
                                    sprintf(ServeurSMTP,"smtp.wanadoo.fr");
                                    // L'identifiant est généralement la première partie du mail
                                    strcpy(StrTampon,EMail);
                                    PtrTmp1 = strstr(StrTampon, StrArobaz);
                                    memset(PtrTmp1,0,sizeof(PtrTmp1));
                                    sprintf(Identifiant,"%s",StrTampon);
                            }

                            // Si l'adresse mail contient wanadoo
                            PtrTmp1 = strstr(EMail, StrFree);
                            if (PtrTmp1 != NULL)
                            {
                                    sprintf(FAI,"Free");
                                    sprintf(ServeurPOP,"pop.free.fr");
                                    sprintf(ServeurSMTP,"smtp.free.fr");
                                    // L'identifiant est généralement la première partie du mail
                                    strcpy(StrTampon,EMail);
                                    PtrTmp1 = strstr(StrTampon, StrArobaz);
                                    memset(PtrTmp1,0,sizeof(PtrTmp1));
                                    sprintf(Identifiant,"%s",StrTampon);
                            }
                    }

                    J'ai quelques variables générales justes après les includes :
                    // Variables générales
                    char *NomServeurPOP;
                    char *NomServeurSMTP;
                    char *NomFAI;
                    char *EMail="monemail@free.fr";
                    unsigned short PortServeurPOP = 110;
                    char *user;

                    // La fonction est définie ici

                    // Appel de la fonction
                    DefinirInfos(EMail, NomServeurPOP, NomServeurSMTP, user, NomFAI);

                    La compilation est OK, mais l'erreur retournée est "Erreur de segmentation", et en utilisant les caractères de commentaires j'ai isolé les commandes provoquant ce message : les sprintf.
                    Quelle est la cause du problème ?

                    Autre question subsidiaire : Comment inclus-t-on les fichiers .c supplémentaires sous Linux, si l'on a choisi de développer sans IDE ?

                    Merci
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      7 février 2006 à 21:07:33

                      Pour tes .c suplémentaire, enfaite tu els compiles 1 à 1 avec gcc, puis c'est quand tu créer l'executable, que tu vas faire -o file1.o file2.o main.o
                      Sinon, pour automatiser, tu a les makefiles, c'est plus pratique ^^
                      (Saufe quand ils ne veulent pas se lencer sous code block >_<)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 février 2006 à 7:18:37

                        Ok, j'essairai ça ...

                        Et pour ma fonction, une idée ? Perso, je pense que c'est une histoire de pointeur sur chaine/chaine, j'ai du faire une confusion quelque part, mais je vois pas où ?

                        Si j'ai bien compris les chaines de caract. en C, ça donne :
                        //Une chaine de caractère de taille non spécifiée
                        char Chaine[];

                        // Un pointeur sur une chaine de caractère : Chaine2 ne contient pas de texte, mais l'adresse d'une chaine de texte.
                        char *Chaine2;

                        // J'ai tenté de faire un pointeur vers Chaine, mais ca marche pas :
                        char *Chaine2 = &Chaine;
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 février 2006 à 10:01:55

                          m@t, c'est toujours
                          ptr + off, l'offset étant automatiquement multiplié par la taille du type pointé. On n'utilise pas de sizeof là dedans, du moins, pas comme ça.

                          Pour la question, le problème vient de :
                          memset(PtrTmp1,0,sizeof(PtrTmp1));
                          parce que tu utilises sizeof PtrTmp1 (pas besoin de parenthèses, c'est un opérateur et PtrTmp1 est une expression) et en fait tu veux la longueur, don cfaudrait utiliser strlen ici.

                          Pour la dernière question, relis un coup le cours sur les chaînes, tu n'as pas saisi la relation chaines (tableaux) et chaines (pointeurs).
                          • Partager sur Facebook
                          • Partager sur Twitter
                            8 février 2006 à 14:35:18

                            @Bluestorm : Je comprends pas de quoi tu parles avec ton histoire de license sur une page Wiki ...

                            J'ai trouvé la solution à mon problème (le fait de changer sizeof en strlen n'a pas résolu le problème, mais c'est vrai que c'est mieux avec ...) :
                            // Variables générales
                            char NomServeurPOP[100];
                            char NomServeurSMTP[100];
                            char NomFAI[100];
                            char* EMail="oeildufaucon@free.fr";
                            unsigned short PortServeurPOP = 110;
                            char user[100];

                            Cette solution est certainement liée à la différence entre chaine de caractère et pointeur sur une chaine de caractère, et j'aimerais savoir pourquoi ce code ci fonctionne et pas l'autre, puisque dans le cours, il est dit qu'on peut définir une chaine des deux manières suivantes, et que les deux ont le même résultat :
                            char NomFAI[100];
                            char* NomFAI;

                            J'ai relu le cours sur les chaines avant de poser ma question, et relu encore avant de répondre maintenant, et en fait je trouve que le cours sur les chaines est un peu confus sur cette différence entre pointeur sur chaine de caractère et chaine de caractère. Un exemple :

                            Citation : M@teo21

                            La fonction strcpy (comme "string copy") permet de copier une chaîne à l'intérieur d'une autre.
                            Son prototype est :

                            Code : C
                            char* strcpy(char* copieDeLaChaine, const char* chaineACopier);


                            Cette fonction prend 2 paramètres :

                            * copieDeLaChaine : c'est un pointeur vers un char* (tableau de char). C'est dans ce tableau que la chaîne sera copiée.


                            Pour moi les deux phrases en gras se contredisent :
                            - Si la seconde est vraie, alors une variable définie par char* MaVariable est un tableau de char. Donc le premier paramètre attendu de la fonction est un tableau de char, puisqu'il est du type char*. Pourtant la phrase 2 dit que c'est un pointeur vers un char*.

                            Voilà, merci pour vos réponses qui permettront de clarifier les choses ...

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              8 février 2006 à 16:49:58

                              //Une chaine :
                              char* Chaine1;
                              Char Chaine2[];
                              //Un pointeur sur chaine :
                              char** PointeurSurChaine;

                              De ce coté la que sa plente non?
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 février 2006 à 17:44:21

                                Ok merci pour ta réponse. Bon, comme le problème originel est résolu, je vais cocher la tite caz'. Et je vais poser mon problème suivant dans un autre topic ...

                                Merci à tous pour vos réponses claires ...
                                • Partager sur Facebook
                                • Partager sur Twitter

                                [Chaine de caract.] Décaler le pointeur

                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                • Editeur
                                • Markdown