Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] - Fonctions de Manipulation de chaîne

    31 janvier 2006 à 23:12:36

    Bonsoir,

    De la même manière qu'au précédent chapitre (les tableaux), je poste mes fonctions de manipulation de chaîne que M@teo a demandé. Je ne les poste pas pour dire "Hey, je suis le plus fort, j'ai réussi" (même si c'est vrai :-° ), mais pour entendre vos critiques quant à mon code.
    Je n'ai pas encore eu le temps de réfléchir beaucoup à strstr();

    Secret (cliquez pour afficher)
    /*
     * Fonctions C de manipulation de chaines
     *
     * par pepe
     */


    int pstrlen(char chaine[]){ /* strlen */
            int i = 0;
            for(i=0; chaine[i] != '\0'; i++){}
            return i;
    }

    void pstrcpy(char chaine[],char copie[]){ /* strcpy */
            int i = 0;
            for(i=0;chaine[i]!='\0';i++){
                    copie[i] = chaine[i];
            }
    }
    void pstrcat(char* chaine,const char* chaine2){ /* strcat */
            int i = pstrlen(chaine);
            int j = 0;
            for(j=0;chaine2[j]!='\0';j++,i++){
                    chaine[i]=chaine2[j];
            }
    }
    int pstrcmp(char chaine[],char chaine2[]){ /* strcmp */
            int retour = 0;
            int i = 0;
            if(pstrlen(chaine) != pstrlen(chaine2))
                    return 1;
            for(i = 0;chaine[i] != '\0'; i++){
                    if(chaine[i] != chaine2[i])
                            return 1;
            }
            return 0;
    }
    char* pstrchr(char chaine[],char find){ /* strchr */
            int i = 0;
            for(i = 0;chaine[i]!='\0';i++){
                    if(chaine[i] == find) return &chaine[i];
            }
            return chaine;
    }
    char* pstrbrk(char chaine[],char list[]){ /* strbrk */
            int i = 0;
            int j = 0;
            for (i=0;chaine[i]!='\0';i++){
                    for(j = 0;list[j]!='\0';j++){
                            if(chaine[i] == list[j]) return &chaine[i];
                    }
            }
            return chaine;
    }


    PS : Je mets en secret pour ceux qui veulent les faire, mais qui ne les ont pas encore fait :p .

    A+, et bonne nuit ;)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      31 janvier 2006 à 23:25:55

      int pstrlen(char chaine[]){ /* strlen */
              int i = 0;
              for(i=0; chaine[i] != '\0'; i++){}
              return i;
      }

      =>
      int pstrlen(char chaine[]){ /* strlen */
              int i = 0;
              while(chaine[++i] != '\0') ;
              return i;
      }


      Pour les autres j'ai trop sommeil pour regarder. Je vais dormir.
      Pense à espacer les opérateurs :
      for(j=0;chaine2[j]!='\0';j++,i++){
      sans sur-espacer. Le manque d'espace nuit à la lisibilité, tout comme le sur-espacement :
      for( j = 0 ; chaine2 [ j ] != '\0' ; j++ , i++ ) {
      Bien :
      for(j = 0; chaine2[j] != '\0'; j++, i++){

      Et aussi, prends l'habitude de faire --i dans tes for, et pas i--. C'est infimement plus rapide. Mais imagine que tu gagnes un cent millième de seconde en faisant for(i;;++i) au lieu de for(i;;i++), et que for(i;;++i) soit deja dans une boucle for. Imagine encore que chacune de ces deux boucles fassent 10'000 itérations. 10'000 * 10'000 * 1/100'000 = 16 secondes :)
      Et franchement, c'est deja bien :)
      • Partager sur Facebook
      • Partager sur Twitter
        31 janvier 2006 à 23:32:54

        victor > ton code est faux ; si on passe "", ça va planter.

        Sinon coller le mot-clé aux parenthèses et celles-ci à l'accolade est une mauvaise habitude, c'est très chiant à lire après...

        Sur ++i et i++, c'est pas fondamentalement vrai ; en fait en C ça n'a aucune influence spécialce, le compilo sait mieux que toi ce qu'il fait, en C++ ça en a si on surcharge ++.

        Remarque générale : Si tu peux, utilise des pointeurs ; yen a qui vont me faire chier comme quoi c'est moche, pas lisible et tout blahblah mais c'est comme ça que ça se fait en C... et c'est plus lisible selon moi.
        • Partager sur Facebook
        • Partager sur Twitter
          31 janvier 2006 à 23:35:49

          Ouais enfin globalement c'est bien t'as compris :)
          J'aurais renvoyé NULL si mes recherches n'ont rien donné en revanche, mais à part ça c'est tout ce que je vois.
          • Partager sur Facebook
          • Partager sur Twitter

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

          Anonyme
            1 février 2006 à 0:13:42

            Citation : rz0

            victor > ton code est faux ; si on passe "", ça va planter.

            En effet.

            int pstrlen(char chaine[]){ /* strlen */
                    int i = 0;
                    while(chaine[i++] != '\0') ;
                    return i;
            }
            Ca par contre, ca devrait aller.

            Oké pour le ++x et x++. C'est un truc j'avais lu sur un site qui me semblait de confiance : http://www.cprogramming.com/ :-°
            • Partager sur Facebook
            • Partager sur Twitter
              1 février 2006 à 13:51:19

              Merci.

              J'ai tenu compte de vos remarques à propos de l'espacement, mais que fais-je de la remarque à propos de la post-incrémentation vs. pré-incrémentation ?

              Voici en cadeau bonus (je sais que vous l'attendiez tous), ma fonction strstr() :D :
              int pstrstr(char chaine[],char chaine2[]){ /* strstr */
                      int i = 0;
                      int j = 0;
                      int k = 0;
                      for(i = 0; chaine[i] != '\0'; i++){
                              if(chaine[i] == chaine2[j]){
                                      for(j = 0; chaine2[j] != '\0'; i++, j++){
                                              if(chaine[i] == chaine2[j]) k++;
                                              else break;
                                      }
                              }
                              if(k == pstrlen(chaine2)) break;
                      }
                              if(k == pstrlen(chaine2)) return 1;
                              else return 0;
              }


              Voilà, il y a sûrement moyen de l'optimiser ;) .
              • Partager sur Facebook
              • Partager sur Twitter

              [C] - Fonctions de Manipulation de chaîne

              × 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