Partage
  • Partager sur Facebook
  • Partager sur Twitter

chaine erreur

    15 juillet 2006 à 22:05:54

    Bonjour, j'ai essayer de refaire la fonction strcat dans la librairie string.h.
    (celle qui concatène deux chaine) :D .Malheureusement quand j'arrive pour mettre cette fonction à l'action mon programme plante lamentablement. :( Voici le code source de ma fonction :-° .


    </code>
    void str_concatene_chaine(char *chaine, char *concatene)
     {



    long i = 0, ii = 0;

    //je crée une boucle qui va se rendre jusquà la fin de la chaine//

    for(i = 0; chaine[i] != '\0'; i++)
    {
    chaine[i];

     //une fois rendu au signe '\0' on remplace celui ci par une tabulation//

     if (chaine[i] == '\0')
     {
     chaine[i] == ' ';
     }


    }

    //je crée une autre boucle qui va copier le contenu dans la chaine initiale//

    for(ii = 0; concatene[ii] =! '\0'; ii++)
    {
    i++;
    chaine[i] = concatene[ii];
    }

    /*on remet le '\0' qu'on avait enlever tentot grace a une simple incrémentation
    de 1 */


    i += 1;
    chaine[i] = '\0';
    <code type="c">
    • Partager sur Facebook
    • Partager sur Twitter
      16 juillet 2006 à 1:53:41

      slt,
      Voici comment je l'aurai fait.
      voici le proto :
      char *my_strcat (char *dest, char *src);


      #include <stdlib.h>
      #include <stdio.h>

      //recode de la fonction strlen en recursive

      int my_strlen(char *str)
      {
           return(*str ? 1 + my_strlen(str + 1) : 0);
      }

      char *my_strcat(char *dest,  char *src)
      {
        char *ret; // fruit de la concatenation dest/src.
        int  i; // compteur

        //J'alloue un espace memoire necessaire.
        //La taille de ma chaine final = taille de la chaine dest + taille de la chaine src.
        //Je n'oublie pas de tester la valeur de retour de malloc, si jamais le programme n'arrive
        //pas a allouer je retourne NULL.
        if ((ret = (char *) malloc((my_strlen(dest)+ my_strlen(src))* sizeof(ret))) == NULL)
           {
             return (NULL);
           }
        //je fais un debut de copie...
        for (i = 0; i < my_strlen(dest); i++)
           ret[i] = dest[i];
       // je rajoute la suite...
       for (i = my_strlen(dest); i < my_strlen(dest) + my_strlen(src); i++)
           ret[i] = src[i - my_strlen(dest)];
       // je n'oublie pas de rajouter 0 (parfois necessaire)
        ret[i] = '\0';
        //et je retourne ma variable.
        return (ret);
      }

      • Partager sur Facebook
      • Partager sur Twitter
        16 juillet 2006 à 16:01:22

        tu peut tu juste me dire ce qui cloche dans ma fonction car il y a des principes que je ne comprend pas dans la tienne.
        • Partager sur Facebook
        • Partager sur Twitter
          16 juillet 2006 à 21:05:51

          Slt, je vais essayer de t'expliquer comment fonctionne un programme au niveau de la memoire et expliquer pourquoi ton programme bug.

          Au lancement de ton programme, l'OS (XP etc.) alloue un certain espace memoire (4 giga pour les systeme 32bits). On appellera cette espace memoire : stack ou pile.
          Dans les plus basse couches dite "zone de textes et zone de donnees" , tu as toutes les variables que tu as intialisé "en dur" et autres.
          ex char *str = "toto".
          On peut par erreur ecrire dans ces zone de mémoires, le risque est de faire un "debordement", c'est a dire d'ecrire sur la zone et ecraser une zone voisine.
          La couche superieure est un espace dynamique (c'est d'ailleur la plus grosse couche de la stack). Elle te permet en autre d'allouer de la mémoire (malloc) et desallouer (free).

          Tu veux concatener deux variables VARA et VARB en VARA_VARB.
          La chose que tu as omis c'est que si ta variable VARA a ete rentre "en dur" alors tu feras une erreur de segmentation (debordement).
          ex my_strcat("hello", " world"); // erreur de segmentation
          char *dest = "hello";
          my_strcat(dest, " world");// erreur de segmentation

          C'est pour cela qu'il est obligatoire d'allouer un espace memoire suffisant pour concatener (voir tuto de mateo sur les variables allouees dynamiquement).

          Je vais commenter mon code pour que tu puisse comprendre.
          • Partager sur Facebook
          • Partager sur Twitter
            17 juillet 2006 à 15:31:58

            y'a encore des trucs que je comprend pas du genre sizezero.Pourrais tu juste prendre ma fonction et seulement la corriger en restant avec le même prototype bien sur. Désoler si je te fait perdre du temps :(
            • Partager sur Facebook
            • Partager sur Twitter
              17 juillet 2006 à 17:15:20

              Slt, ca me derange pas de t'aider. :)
              Comme je le disais precedemment, tu peux pas faire ce genre de manipulation.
              Tu ajoutes de l'espace memoire qui n'est autorisee a ta variable "char *chaine"
              Il faut revoir ton algo.
              Pour comprendre l'histoire d'allocation, je te conseille d'abord un recode de strdup ;)
              Allez bon courage
              • Partager sur Facebook
              • Partager sur Twitter
                18 juillet 2006 à 17:28:21

                j'ai décider de faire les autres fonction et de retourner plus tard sur celle-ci pourtant j'ai encore une fonction qui ne marche pas. C'est strcmp. Pensse tu qu'il me manque des bases de c ou c'est seulement un manque de logique de ma par?

                </code>

                long str_compare_chaine(char *chaine1, char *chaine2)
                        {

                /*crée une boucle qui va comparer les deux chaine avec des conditions pour
                décider quoi renvoyer */


                long i = 0;

                for(i = 0; chaine2[i] < '\0' && chaine1[i] < '\0'; i++)
                {

                  if (chaine1[i] == chaine2[i])
                  {
                  return 1;
                  }

                  else
                  {
                  return 0;
                  }

                }


                       }
                <code type="c">
                • Partager sur Facebook
                • Partager sur Twitter
                  18 juillet 2006 à 17:36:17

                  Tu as les bases fondamentales du C, mais tu manques encore de subtilite et tu as quelques problemes algorythmiques. Y'a des astuces qu'on peut apprendre que par la pratique et non la theorie !! :-°

                   for(i = 0; chaine2[i] < '\0' && chaine1[i] < '\0'; i++)
                       {
                            if (chaine1[i] == chaine2[i])
                                 {
                                      return 1;
                                 }
                            else
                                 {
                                 return 0;
                                 }
                       }

                  Admettons que tu compares "toto" et "titi"
                  tu verifie si les lettres se correspondent c'est bien. Mais tu dois tous les comparer.
                  Hors dans ton code tu compares la premiere lettre et tu fais un return 1.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 juillet 2006 à 22:37:16

                    Je dois avouer que j'ai de la misère a comprendre pourquoi ma fonction compare qu'une seul lettre car j'ai une boucle qui dit bien de comparer jusqu'a temps qu'il soit rendu au signe ultime '\0'. Mais je pensse que ma fonction renvoie 1 a chaque fois. Si la dernière lettre est fausse la fonction marchera correctement mais si elle est fausse au milieu du mot elle n'auras surement aucune effet car la fonction ne se fira qu'au dernier caractère. Mais comment lui dire de renvoyer un 1 pour l'ensemble alors? :euh:
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 juillet 2006 à 22:46:38

                      ya une astuce , dans le jargon on appelle ca un flag, variable temoin.

                      par exemple:
                      Lorsque j'ai deux lettres identiques j'incremente mon flag.
                      a la fin de ma boucle je verifie si mon flag == la longueur de ma chaine.
                      Si oui alors je retourne 1 sinon 0.

                      En fai le strcmp retourne 0 quand c identique....
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 juillet 2006 à 23:28:39

                        voila j'ai fait comme tu m'as dit. Mais vraissemblablement elle ne marche toujours pas.

                        </code>

                        long str_compare_chaine(char *chaine1, char *chaine2)
                                     {
                        /*je vais crée deux boucles qui vont déterminer la taille des deux chaines*/

                        long i = 0;
                        long ii = 0;
                        long compare = 0;
                        long flag = 0;

                        for(i = 0; chaine1[i] < '\0'; i++)
                        {
                        }

                        for(i = 0; chaine2[ii] < '\0'; ii++)
                        {
                        }

                        if(i != ii)
                        {
                        return 0;
                        }

                        /* maintenant que j'ai les grandeurs de mes deux chaine je vais pouvoir déter-
                        miner le chiffre auqu'elle m'on "flag" devra s'arrêter pour pouvoir renvoyer un 1. */


                        /* je crée une boucle qui va faire monter le flag si les deux chaines sont égales
                        */


                        for(compare = 0; chaine1[compare] < '\0' && chaine2[compare] < '\0'; compare++)
                        {

                         if (chaine1[compare] == chaine2[compare])
                         {
                         flag++;
                         }

                        }

                        /* mainteant mon flag compté je vais regarder si il égale bien le nombre de case
                        des deux chaines. Si oui c'est que toute les valeurs sont égale et que la fonc-
                        tion peut retourner un 1. Si contraire 0. */


                        if(flag == i && flag == ii)
                        {
                        return 1;
                        }

                        else
                        {
                        return 0;
                        }

                        <code type="c">



                        }
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 juillet 2006 à 23:43:57



                          int mystrlen(char *str)
                          {
                               return (*str ? 1 + mystrlen(str + 1) : 0);
                          }

                          int compare(char *s1, char *s2)
                          {
                               int i = 0;
                               int j = 0;
                               int flag = 0;

                               while(s1[i] && s2[j])
                               {
                                    if (s1[i++] == s2[j++])
                                       {
                                          flag++;
                                       }
                                       else{
                                       break;
                                       }
                                    if (flag == mystrlen(s1))
                                     return (1);
                               }

                          return (0);
                          }

                          int main(int ac, char **av)
                          {


                          printf("%d\n", compare(av[1], av[2]));
                               return (0);
                          }

                          • Partager sur Facebook
                          • Partager sur Twitter
                            19 juillet 2006 à 16:00:59

                            j'ai enfin trouver mon erreur!!. Elle se situait dans les signes de ma boucle.
                            j'ai remplacer les < par des !=.

                            </code>
                            for(compare = 0; chaine1[compare] != '\0' && chaine2[compare] != '\0'; compare++)
                            <code type="c">


                            Et comme tu l'as fait j'ai utilisé la fonction len pour déterminer la grandeur des chaine.Cependant je me pose encore une question.Pourquoi sa marche avec le != et non avec l'autre?


                            • Partager sur Facebook
                            • Partager sur Twitter
                              19 juillet 2006 à 17:29:37

                              Je t'explique pourquoi.

                              Voici la table ascii (en decimal)

                                    0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel
                                     8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si
                                    16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb
                                    24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us
                                    32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  '
                                    40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /
                                    48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7
                                    56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?
                                    64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G
                                    72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O
                                    80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W
                                    88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _
                                    96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g
                                   104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o
                                   112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w
                                   120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del
                                 

                              Voici ce que tu avais mis

                              Citation : boucle for

                              chaine1[i] < '\0'


                              la valeur ascii de chaque lettre est obligatoirement plus grande que \0 (null)
                              Donc tu ne rentrais pas dans tes boucles puisque la condition etait toujours fausse.
                              Voila ce qu'il faut se dire quand tu parcours une chaine.
                              - Une chaine se termine par un \0.
                              Donc tu fais une boucle dont la condition iterative (incrementation ou decrementation) est que
                              "tant que la lettre ou je suis n'est pas un \0"
                              des que tu arrives au \0 la condition n'est plus valable tu sors de la boucle.

                              Je te propose quelques exos marrants pour consolider tes connaissances et mettre au point des algos :

                              1) Faire un executable qui prend en parametre une chaine de caractere.
                              Cette chaine de caractere doit etre traitee de la facon suivante :
                              Mettre tous les majuscules en minuscules et tous les minuscules en majuscules.
                              Les autres caracteres doivent etre affiche normalement.
                              Si l'executable n'a pas de parametre tu affiche un \n. et tu quitte le programme.
                              ex : $>./vice_versa "abCdeF"
                              ABcDEf
                              $>
                              2)Faire un executable qui prend en parametre une chaine de caractere
                              Cette chaine de caractere doit etre traitee de la facon suivante :
                              Decaler les lettres de un. Si la lettre est Z elle deviendra A. Respectez les majuscules et les minucules.
                              Si l'executable n'a pas de parametre tu affiche un \n. et tu quitte le programme.
                              ex : $>./decal "abcdEfg"
                              bcdeFgh
                              $>
                              3) Faire un executable qui prend en parametre une chaine de caractere
                              Cette chaine de caractere doit etre traitee de la facon suivante :
                              Nettoyer la chaine de maniere a ce qu'il n'y a qu'un seul espace entre chaque mot.
                              Definition d'un mot : ensemble de caractere delimite par deux espaces ou debutant au debut de la chaine ou a la fin de la chaine.
                              _ = ' ' (espace)
                              ex : $>./epur "dsfgfdgdf________________________fgfg_________________654'(-______zerzer_______________________zeriopzeir i____ezr"
                              dsfgfdgdf fgfg zerzer 654'(- rzeriopzeir i ezr
                              $>
                              PS : pour les exos tu n'as pas besoin de stocker le resultat dans une variable. Affiche caractere par caractere avec putchar.

                              bon j'en ai d'autres mais j'attendrais un peu....
                              • Partager sur Facebook
                              • Partager sur Twitter
                                23 juillet 2006 à 23:59:07

                                j'ai essayer la première. Mais il y'a un truc qui cloche :( . Ma fonction fait de majuscule jusqu'a minuscule Mais pas l'inversse :euh:.

                                peut tu me dire se qui cloche dans ce code?

                                </code>
                                #include "fonction 1 2 3.h"
                                #define RETOUR(flag) if (flag == 0)\
                                                     return 0; \
                                                     else \
                                                     return 1;





                                // transforme minuscule en majuscule et visse verssa //

                                long MaJ_MiN(char *chaine)
                                                    {

                                long flag = 0;
                                long i = 0;
                                long ii = 0;

                                //initialise chaine temporaire avec les lettres de l'alphabet//

                                char chaine_MiN[] = "abcdefghijklmnopqrstuvwxyz";
                                char chaine_MaJ[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

                                /* crée une boucle for disant: si t'elle caractère de la chaine temporaire
                                est égale a celle de la chaine original, remplace le par une majuscule et
                                viceversa */


                                for(ii = 0; chaine[ii] != '\0'; ii++)
                                {




                                 for(i = 0; chaine_MiN[i]  != '\0' && chaine_MaJ[i] != '\0'; i++)
                                 {

                                  if(chaine[ii] == chaine_MiN[i])
                                  {
                                   chaine[ii] = chaine_MaJ[i];
                                   flag++;
                                  }



                                  if(chaine[ii] == chaine_MaJ[i])
                                  {
                                   chaine[ii] = chaine_MiN[i];
                                   flag++;
                                  }

                                 }

                                }

                                /*crée une condition disant: si flag n'a pas incrémenter une seul fois return 0
                                sinon return 1.*/


                                RETOUR(flag)


                                                   }

                                <code type="c">

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 juillet 2006 à 4:53:15

                                  je penses que le probleme vient de tes conditions. Essayes de mettre un else if apres ton if.
                                  quand ta lettre est en minuscule et que tu la transforme en majsucule, tu rentre dans le deuxième if où ta lettre transformé en majuscule retombe en minuscule . :lol: tu n'obtiendras que des minuscules


                                   if(chaine[ii] == chaine_MiN[i])
                                    {
                                     chaine[ii] = chaine_MaJ[i];
                                     flag++;
                                    }
                                    if(chaine[ii] == chaine_MaJ[i])
                                    {
                                     chaine[ii] = chaine_MiN[i];
                                     flag++

                                  @+

                                  tiens j'en ai fait un très court ^^
                                  Secret (cliquez pour afficher)


                                  char *viceversa(char *chaine)
                                  {
                                   long i;
                                   for (i = 0; chaine[i] != '\0'; i++)
                                   {
                                        if(chaine[i] >= 'a' && chaine[i] <= 'z')
                                        {
                                             chaine[i] -= 32;
                                        }
                                        else if(chaine[i] >= 'A' && chaine[i] <= 'Z')
                                        {
                                              chaine[i] += 32
                                        } 
                                   }
                                   return (chaine);
                                  }

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    24 juillet 2006 à 23:19:16

                                    j'ai essayer la troisième. ENCORE UNE FOIS JE ME FOIRE :D.Comment ont fait pour dire a l'ordinateur de remplacer la tabulation par du... vide :euh: . (ceci n'est pas le code final de ma fonction)

                                    </code>
                                    void nettoye_chaine(char *chaine)
                                                                   {


                                    long i;

                                    /* crée une boucle qui va faire entrer i dans une autre de facon à ce qu'elle
                                    s'incrémente tous en remplacent les espaces par rien. */


                                    for (i = 0; chaine[i] != '\0' ; i++)
                                    {

                                     if(chaine[i] == ' ')
                                     {
                                      chaine[i] = ''; // ??? ///
                                     }


                                    }


                                                                    }
                                    <code type="c">
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      25 juillet 2006 à 3:21:21


                                      Citation : Pas de titre

                                      Comment ont fait pour dire a l'ordinateur de remplacer la tabulation par du... vide :euh: . (ceci n'est pas le code final de ma fonction)


                                      je sais pas.
                                      je sais que tab => '\t';
                                      et si tu écrasais le bloque d'espaces par les caractères qui suivent?
                                      comme ca, je crois que c'est faisable
                                      [a][b][][][][][c][d][e]
                                      [a][b][c][d][e][0][0][0][0]
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      chaine erreur

                                      × 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