Partage
  • Partager sur Facebook
  • Partager sur Twitter

Concatener deux chaines...

Que pensez-vous de cette fonction ?

Sujet résolu
    18 juillet 2006 à 19:25:05

    Bonjour :)

    Voilà je venais quérir votre avis sur une fonction de ma composition qui permet deux concatener deux chaines. Bien sûr je l'ai faite d'après les conseils de M@téo sur les tutoriaux C++. J'avoue avoir galèrer pour la créer. o_O
    Mais le hic c'est que même si elle marche je ne suis pas satisfait...
    Donc je voulais connaitre votre avis dessus, optimisations, erreures. j'en profite aussi pour mettre la fonction permettant de recopier un tableau par dessus un autre même si celle-ci me satisfait ^^
    Merci de votre attention ;)


    //Fonction permettant de concatener deux tableaux de caractères.
    char* Concatene_Chaine(char* Chaine_1, const char* Chaine_2)
    {
    long i = Compteur_Caracteres(Chaine_1), i2 = 0, Valeur_1 = Compteur_Caracteres(Chaine_1), Valeur_2 = Compteur_Caracteres(Chaine_2)+1, Valeur_Totale = Valeur_1+Valeur_2;

    while (i < Valeur_Totale /*|| i < Valeur_Totale*/)
        {
        Chaine_1[i] = Chaine_2[i2];
        i++;
        i2++;
        }
    return Chaine_1;
    }

    //Fonction permettant de rcopier un tableau par-dessus un autre
    char* Integre_Chaine(const char* Texte, char* Copie)
    {
    long i = 0, Longueur = Compteur_Caracteres(Texte);

    for(i = 0 ; i < Longueur ; i++ )
        {
        //printf(" i = %ld\n", i);
        Copie[i] = Texte[i];
        //printf("%ld = %s\n", i, Texte[i]);
        }
    return Copie;
    }


    Bien sûr si je demande votre avis c'est par soucis du détail et pour pouvoir m'affiner (comme le camembert) :p
    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2006 à 19:37:50

      premier pb, bien que je m'y connaise pas plus que toi:

      while (i < Valeur_Totale || i < Valeur_Totale)
      o_Oo_Oo_O , ou alors, t'as un i et un i2 ^^

      ensuite, t sûr que ça marche, tu finis pas t chaine par '\0', tu ne mets pas d'espace entre les mots.

      Tu devrais metrre ton code en entier parce que je comprends pas tout là :-°


      @+ :soleil:
      • Partager sur Facebook
      • Partager sur Twitter
        18 juillet 2006 à 19:42:59

        Ouhlalala o_O J'avais pas fais gaffe à ça :-°
        Oui sinon ça marche très bien :) avec ou sans espaces :)
        Comme tu peux le lire dans mon code oui il ya bien un i2 mais là dans ma fonction c'est vraiment un manque d'attention flagrant... o_O
        Pour le '\0' pas besoin de le mettre étant donné qu'il est recopié :D Je commente cette ligne dans mon post et la remet d'aplomb :)

        Sinon j'appel simplement la fonction dans la main donc je ne pense pas que ce soit utile de le mettre :)
        P.S: J'aime bien ta signature :p
        • Partager sur Facebook
        • Partager sur Twitter
          18 juillet 2006 à 20:08:03

          Petite simplification: long i = valeur1 = Compteur_Caracteres(Chaine_1);

          Sinon, c vrai que c plus court que le mien :-°


          @+ :soleil:
          • Partager sur Facebook
          • Partager sur Twitter
            18 juillet 2006 à 20:27:01

            Merci, ta remarque ma fais voir qu'il y avait un "+1" en trop à "Valeur_1 = Compteur_Caracteres(Chaine_1)+1" ;) mais par contre j'ai essayé de définir à ta manière et ça ne se compile pas. Celà viendrait du fait que j'utilise codeblocks ? Qu'utilises-tu comme IDE ? o_O J'avoue être sceptique sur ta manière de définir "i" et "Valeur_1" mais si tu dis celà c'est que ça dois fonctionner pour toi. :)
            • Partager sur Facebook
            • Partager sur Twitter
              18 juillet 2006 à 21:28:36

              Ca marche pas pour ce test :
              char *toto = "hello";
              printf("%s\n", Concatene_Chaine(toto," world"));
              ou ce test
              printf("%s\n", Concatene_Chaine("hello"," world"));

              indice(allocation dynamique)
              • Partager sur Facebook
              • Partager sur Twitter
                18 juillet 2006 à 21:46:36

                Merci :) Effectivement ça plante mais je ne cerne pas mon erreur :o
                • Partager sur Facebook
                • Partager sur Twitter
                  18 juillet 2006 à 21:55:34

                  Ce sont des erreurs de segmentations de memoire.
                  Tu ecris dans une zone qui ne t'es pas autorisee, et le programme crashe.
                  Tu dois allouer une nouvelle chaine de caractere independante des deux passee en parametre dont la taille sera la somme des longueurs des deux chaines.
                  Je t'invite a voir ce post http://www.siteduzero.com/forum-83-58099-p1-chaine-erreur.html
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 juillet 2006 à 22:08:24

                    D'accord, je crois comprend en fait, détrompez moi si besoin est ;)

                    La manière par laquelle tu donnes les chaines de Char ne définissent pas la taille de Chaine_1 (celle qui reçoit la concaténation). Hors dans les cours de Matéo il précise bien:

                    Citation : M@téo


                    /* On crée 2 chaînes. chaine1 doit être assez grande pour accueillir
                    le contenu de chaine2 en plus, sinon risque de plantage */
                    char chaine1[100] = "Salut ", chaine2[] = "Mateo21";


                    Tu trouveras ça sur cette page (au milieu).

                    Mais il est vrai qu'il faut tester et pallier à tout les nombreux cas de figures :euh:
                    Vivement le C++ :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 juillet 2006 à 22:33:29

                      Oui, c'est vrai pour les tableaux mais pas pour cet exemple :
                      printf("%s\n", Concatene_Chaine("hello"," world"));

                      PS: le vrai strcat alloue de la memoire. (apres ca depend si tu veux le recoder exactement ;) )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 juillet 2006 à 22:40:47

                        Désolé j'ai ré-éditer mon message à de nombreuses reprises, au fûr et à mesure que je m'apercevais de mes erreurs. :-°

                        Ce qui est évident c'est que nous n'avons pas le même niveau o_O:waw: Personnellement pour mon apprentissage je me contente de faire ce qu'on me dit :p je t'avouerais que je n'ai pas chercher à tester toutes les situations et encore moins à recoder strcpy (si je prend strcpy pour ton exemple il plante aussi) :euh:
                        Mais dit, nous ne baignerions pas en plein C++ là ? o_O
                        Mais tu as eu raison de me faire remarquer ceci même si je n'en suis pas encore là ^^ Et je t'en remercie ;) Mais je ne sais pas si ce serait une bonne idée de me concentrer dessus. :o
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 juillet 2006 à 22:49:36

                          ^^; c'est vrai qu'on est parti en freestyle :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 juillet 2006 à 22:54:22

                            Ce n'est pas un problème ;) ca me permet de voir si j'ai bien compris (apparement oui... enfin je l'espère :o ) et ça me permet aussi et surtout de comprendre les avantages du C++ :D Enfin chaques choses en son temps et chaques choses à son temps ^^ Je part de ce pas me concentrer sur la prochaine fonction ( j'aime trop ça décidement :D ) Par contre si tu pouvais me donner aussi ton avis sur cette version de strcpy ça m'intérresserais. ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              18 juillet 2006 à 23:02:31

                              Pas vraiment, en fait j'aimerais savoir si c'est optimiser au maximum ^^ Comme je l'expliquais au début de mon post je ne suis pas satisfait de cette fonction et j'aimerais savoir si, elle est l'équivalent (en mieux ou en moins bien) de strcpy et s'il est possible de l'optimiser. :) Histoire dque je me débarrasse de cette sale impression. :colere2:
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 juillet 2006 à 23:24:14

                                c presque parfait... j'aurai mis a la fin \0. mais apres tout tu peux recopier des caracteres non-imprimable :p c ton droit
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  18 juillet 2006 à 23:34:12

                                  Merci :) Je n'en dormirais que mieux ce soir pour répartir de plus belle demain ^^ Et hop problème résolu :D
                                  Je vous remercie pour votre aide et vous redis à bientôt pour de nouvelles ZerOventures ;)

                                  Amicalement ^^

                                  Squalthor ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Concatener deux chaines...

                                  × 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