Partage
  • Partager sur Facebook
  • Partager sur Twitter

probléme de manipulation de chaine

    29 septembre 2007 à 21:25:21

    Bonjour,
    bon voila j'ai besoin d'une fonction parser (de mise en forme pour retirer des balise) dans mon programme j'ai donc créer cette fonction à par :

    main.cpp
    1. #include <iostream>
    2. using namespace std;
    3. char *parser(char *buffer,const char *balise, int decalage);
    4. char *parser(char *buffer,const char *balise, int decalage)
    5. {
    6.     //cout<<buffer;
    7.     char *balise_debut, *balise_fin;
    8.     balise_debut = new char[sizeof(balise)+2];   //+2 = '<' et '>'
    9.     balise_fin = new char[sizeof(balise)+3];     //+3 = '<', '/' et '>'
    10.     sprintf(balise_debut, "<%s>", balise);      //on créer la balise de début
    11.     sprintf(balise_fin, "</%s>", balise);       //on créer la balise de fin
    12.     //printf("balise debut : %s\nbalise fin : %s",balise_debut, balise_fin);
    13.     char *chaine_debut, *chaine_fin, *chaine;
    14.     chaine_debut = (strstr((buffer + decalage), balise_debut) + sizeof(balise_debut)); // pointeur vers le debut de la chaine
    15.     chaine_fin = strstr((buffer + decalage), balise_fin); //pointeur vers la fin de la chaine
    16.     chaine = new char[(chaine_fin - chaine_debut)];             // on alloue la taille de la chaine
    17.     strncpy(chaine, chaine_debut,(chaine_fin - chaine_debut));  // et on insere la chaine dans la mémoire alloué
    18.     decalage =(chaine_fin + sizeof(balise_fin)) - buffer; // autre...
    19.     printf("%s", chaine); // test
    20. }
    21. int main (int argc, char* argv[])
    22. {
    23.     char *chaine;
    24.     chaine = parser("<app>bonjour je ne veut pas de toi </app>\n"
    25.                     "<text>en effet tu est très moche</text>\n"
    26.                     "<app>au eh puis si en fait</app>\n","app",0);
    27.     return 0;
    28. }

    Le probleme c'est qu'elle ne retourne pas ce qu'il faut :

    >bonjour je ne veut pas de toi

    et si on remplace app par text dans l'appelle a la fonction elle renvoie ceci :
    t>en effet tu est très moche
    • Partager sur Facebook
    • Partager sur Twitter
      29 septembre 2007 à 21:57:07

      tu te compliques la vie pour rien, en C++ autant utiliser std::string puis string::find + string::substr
      • Partager sur Facebook
      • Partager sur Twitter
        30 septembre 2007 à 11:35:37

        Et pourquoi sa marche pas :D ?
        • Partager sur Facebook
        • Partager sur Twitter
          1 octobre 2007 à 20:36:30

          Up , toujours besoin d'aide merci :)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            1 octobre 2007 à 21:29:39

            Recherche du côté de pointeur et tableau, problème déjà abordé ;) .
            • Partager sur Facebook
            • Partager sur Twitter
              2 octobre 2007 à 21:11:00

              Pardon :( mais j'ai chercher sur le forum et je trouve pas tu peux être un peux plus précis sur ce que je doit chercher , s'il te plait. Merci :)
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                2 octobre 2007 à 21:20:15

                C'est demandé si gentillement que je ne peux qu'accepter ;) .
                http://www.siteduzero.com/forum-83-128177-p1-cha-ne-de-caract-res.html

                PS : il y a eut d'autre topic plus ressent mais je ne les trouve plus...
                • Partager sur Facebook
                • Partager sur Twitter
                  3 octobre 2007 à 21:20:08

                  J'ai lu le sujet que tu ma donné :)
                  Mais je comprend toujours pas, je ne crois pas entrer dans un cas ou m'est variable ne sont ps initialisé, enfin je veux dire j'alloue la mémoire pour chaque chaine qui va être utilisé.
                  Et pour ce qui est de chaine_debut et chaine_fin strstr renvoie un char* donc c'est bon .... :euh: non ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    3 octobre 2007 à 23:24:36

                    Citation : Bull_

                    Et pour ce qui est de chaine_debut et chaine_fin strstr renvoie un char* donc c'est bon .... :euh: non ?

                    Justement pas. :(
                    Si qqn peut expliquer car j'ai pas mal de peine aussi la dedans (vive les string!).
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 octobre 2007 à 6:01:15

                      Ce qu'on essai de te dire c'est qu'en C++ on a des moyens beaucoup plus puissants de manipuler les chaines que de simple tableau de char et des fonction C comme sprintf, strstr, strcmp, strcpy, etc.

                      Bienvenue dans le C++, bienvenue dans la STL, bienvenue dans la POO : http://www.cppreference.com/cppstring/index.html

                      Le lien présente les méthodes de la classe string, à toi d'apprendre :)
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 octobre 2007 à 18:53:56

                        mais je ne doute pas de l'éfficacité des string en c++ je voulait juste comprendre ce qui n'allait pas dans mon programme ...

                        PS si sa interesse quelqu'un la solution en string :
                        1. #include <iostream>
                        2. #include <string>
                        3. using namespace std;
                        4. string parser(string buffer,string balise);
                        5. string parser(string buffer,string balise)
                        6. {
                        7.     string balise_debut, balise_fin;
                        8.     balise_debut = "<"+balise+">";
                        9.     balise_fin = "</"+balise+">";
                        10.     size_t chaine_debut, chaine_fin;
                        11.     chaine_debut = buffer.find(balise_debut) + balise_debut.size();
                        12.     chaine_fin = buffer.find(balise_fin);
                        13.     string chaine;
                        14.     chaine.assign(buffer, chaine_debut, (chaine_fin - chaine_debut));
                        15.     return chaine;
                        16. }
                        17. int main (int argc, char* argv[])
                        18. {
                        19.     string chaine;
                        20.     chaine = parser("<app>bonjour je ne veut pas de toi </app>\n"
                        21.                     "<text>en effet tu est tres moche</text>\n"
                        22.                     "<app>au eh puis si en fait</app>\n","text");
                        23.     cout<<chaine;
                        24.    return 0;
                        25. }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 octobre 2007 à 19:01:19

                          tu peux (avantageusement ?) remplacer "assign" par "substr".
                          donc çà remplacerait :
                          1. string chaine;
                          2. chaine.assign(buffer, chaine_debut, (chaine_fin - chaine_debut));
                          3. return chaine;

                          par
                          1. return buffer.substr(chaine_debut, (chaine_fin - chaine_debut));
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 octobre 2007 à 21:42:53

                            :( decidément ils aiment bien les hors sujet sur ce site ...
                            merci quand même pour l'astuce mais on peut discuter d'autre chose jusque demain si on veut et ce dans n'importe quelle sujet donc si ce n'est pas pour répondre à ma question à savoir :
                            Pourquoi l'utilisation d'un char* déclarer précedament comme je l'ai fait provoque t'il un comportement indéfini ?


                            Alors mieux vaut allez posté dans discution géneral ....
                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 octobre 2007 à 21:48:27

                              probablement une erreur avec la variable "decalage" (un de plus ou de moins çà fait toute la différence)
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                4 octobre 2007 à 21:50:25

                                Je suis pas sûr mais je tente : avec la déclaration d'un pointeur comme ça :
                                1. char*p;

                                Une seule "case" de mémoire est allouée.
                                Si tu fais :
                                1. char*t = f("ABC"); // f retourne un char* qui est un tableau

                                C'est bon car les cases ont été allouées.
                                Mais si tu fais :
                                1. char*ft;
                                2. ft = f("ABC");

                                Les cases ne sont pas allouées comme le pointeur n'est pas initialisé comme un tableau.

                                Je décline de toute responsabilité en cas de faute de ma part. :p
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  5 octobre 2007 à 21:55:44

                                  Citation : Bull_

                                  :( decidément ils aiment bien les hors sujet sur ce site ...
                                  merci quand même pour l'astuce mais on peut discuter d'autre chose jusque demain si on veut et ce dans n'importe quelle sujet donc si ce n'est pas pour répondre à ma question à savoir :

                                  Pourquoi l'utilisation d'un char* déclarer précedament comme je l'ai fait provoque t'il un comportement indéfini ?



                                  Alors mieux vaut allez posté dans discution géneral ....



                                  Pas dans discussions générales mais bien sur le forum C... il seront bien plus en mesure de t'aider. Perso, je n'ai jamais utiliser sprintf() et strstr(), c'est archaïque...
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  probléme de manipulation de chaine

                                  × 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