Partage
  • Partager sur Facebook
  • Partager sur Twitter

manipulation de chaine de caractères

    7 juin 2006 à 16:16:50

    Slt à tous, je debute en c++ (je vient de finir le tuto du site) et j'ai besoin de manipuler des chaines de caractères, j'ai donc essayé de creer les fonctions dont j'ai besoin:
    • strpos, qui renvoie l'index de la première occurence d'une sous-chaine (ou -1 s'il ne la trouve pas)
    • nb_occurences, qui revoie le nombre d'occurences d'une sous chaine
    • str_replace, qui remplace une sous-chaine par une autre


    Elles marchent, mais j'ai l'impression que je me suis compliqué la vie (surtout pour str_replace lol).

    Voila les fonctions:

    /**************************************
     * traitement de chaine de caractères *
     **************************************/

     
    //retourne l'index du premier caractère de la première occurence de sous_chaine
    int strpos(const char* chaine, const char* sous_chaine){
        int i;
        int j;
        int sous_chaine_len = strlen(sous_chaine);
        if(strlen(chaine) < sous_chaine_len)
        return -1;
        for(i=0; i<=(strlen(chaine)-sous_chaine_len); i++){
            for(j=0; j<=(sous_chaine_len-1); j++){
                if(chaine[i + j] != sous_chaine[j])
                break;
            }
            if(j == sous_chaine_len)
            return i;
        }
        return -1;
    }

    //retourne le nombre d'occurences de la sous-chaine
    int nb_occurences(const char* chaine, const char* sous_chaine){
        int i = 0;
        int nb = 0;
        int sous_chaine_len = strlen(sous_chaine);
        while(i<=(strlen(chaine)-sous_chaine_len)){
            if(strpos(chaine + i,sous_chaine) != -1){
                i += strpos(chaine+i,sous_chaine) + sous_chaine_len;
                nb++;
            }
            else return nb;
        }
        return nb;
    }

    //remplace une sous-chaine par un autre
    char* str_replace(char* chaine_initiale, const char* chaine_a_remplacer, const char* chaine_de_remplacement){
        int i = 0;
        int j = 0;
        int chaine_initiale_len = strlen(chaine_initiale);
        int chaine_a_remplacer_len = strlen(chaine_a_remplacer);
        int chaine_de_remplacement_len = strlen(chaine_de_remplacement);
        char* chaine_finale = NULL;
        int taille_finale = chaine_initiale_len + (chaine_de_remplacement_len - chaine_a_remplacer_len) * nb_occurences(chaine_initiale, chaine_a_remplacer);
        if(!(chaine_finale = new char[taille_finale])){
            cout << "Echec d'allocation memoire";
            getchar();
            exit(1);
        }
        *chaine_finale = '\0';
        while(i<=(chaine_initiale_len - 1)){
            if(strpos(chaine_initiale + i,chaine_a_remplacer) != -1){
                i += strpos(chaine_initiale + i,chaine_a_remplacer);
                *(chaine_initiale + i) = '\0';
                strcat(chaine_finale, chaine_initiale + j);
                strcat(chaine_finale, chaine_de_remplacement);
                i += chaine_a_remplacer_len;
                j = i;
            }
            else{
                strcat(chaine_finale, chaine_initiale + i);
                return chaine_finale;           
            }
        }
        return chaine_finale;
    }


    Voila, est ce que vous pouvez me dire ce que je devrai changer, si j'ai fait des boulettes à eviter lol, et si vous avez d'autres méthodes pour remplacer ces fonctions?

    voila ce que fait ma fonction str_replace:
    -elle calcule la taille de la chaine finale
    -cherche la première occurence de la sous-chaine à remplacer dans la chaine initiale
    -remplace le premier carractère cette sous-chaine par \0
    -concatène la chaine finale avec la chaine initiale ainsi modifiée
    -concatène la chaine finale avec la chaine de remplacement
    -bouge le pointeur de la chaine initiale jusqu'a la fin de la sous chaine à remplacer

    puis refait la même chose jusqu'a la fin

    merci pour vos réponses :)


    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2006 à 16:58:03

      Citation : cyril_sy

      Slt à tous, je debute en c++ (je vient de finir le tuto du site)


      Alors, a ma connaissance, il s'agit du C...

      Citation : Pas de titre


      Voila les fonctions:

          if(!(chaine_finale = new char[taille_finale])){



      Tu as vu ça dans le cours de M@teo ?

      Si c'est le cas, il devient urgent de séparer les forums C et C++...


      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        8 juin 2006 à 2:17:09

        tu pourai aussi t'aider des fonctions predéfini dans
        <string.h>
        comme
        char * strstr ( const char * string1, const char * string2 );
        qui te renvoi un pointeur qui pointe sur la premiere occurence.

        pour l'index du premier caractère, il te suffit de faire la difference entre le pointeur renvoyé par strstr et celui de ta chaine global.

        Citation : c++


        char str1[]="allo Zero? ca va?";
        char str2[]="Zero";
        char * ret;
        ret=strstr(str1,str2);
        printf("chaine 1:%s\nchaine 2:%s\nposition:%d\n",&str1,&str2,ret-str1);



        pour :retourne le nombre d'occurences de la sous-chaine
        suffit que tu retraitre la chaine de caractere pointé par la variable retourné par strstr si celci est different de NULL donc de compté le nombre de fois tu l'execute

        Citation : c++


        char str1[] = "allo Zero? ca va? Zero tu est la?";
        char str2[] = "Zero";
        char *ret = str1;
        char nb=0;

        while((ret = strstr(ret, str2)) != NULL)
        {
        nb++;ret++;
        }

        printf("chaine 1:%s\nchaine 2:%s\nnombre:%d\n", &str1, &str2, nb);


        J'espere que cela t'aidera..
        • Partager sur Facebook
        • Partager sur Twitter
          8 juin 2006 à 12:34:38

          ok merci pour vos reponses :)

          Pour ce qui est du c et c++, je na fait pas trop la difference en fait :-°
          en fait j'ai suivi le tuto du site, et en même temps un tuto de c++, donc je me mélange un peu lol...
          • Partager sur Facebook
          • Partager sur Twitter
            8 juin 2006 à 14:33:35

            Citation : cyril_sy

            Pour ce qui est du c et c++, je na fait pas trop la difference en fait :-°
            en fait j'ai suivi le tuto du site, et en même temps un tuto de c++, donc je me mélange un peu lol...


            Tu vas dans le mur. C et C++ sont des langages différents.

            Je te conseille, dans un premiers temps), de faire un choix exclusif et de t'y tenir. Une fois que tu maitriseras le langage choisi, tu pourras apprendre l'autre.
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !

            manipulation de chaine de caractères

            × 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