Partage
  • Partager sur Facebook
  • Partager sur Twitter

Une erreur bizarre

Erreurs : retour variable locale et taille d'une chaine

    12 août 2008 à 16:47:38

    Salut à tous.
    Après avoir réaliser une fonction similaire à la fonction prédefinie "strchr", je me rend compte qu'une erreur bizarre surgit si je met la taille de la chaine 50. Pourtant je suis toujours loin de la dépasser. Et il y a aussi un Warning qui me dit qu'il est interdit de retourner une variable locale. Je ne comprend pas...
    Voiçi le code commenté de la fonction :

    char* strchr2(const char* ch, int c) // c représente la lettre que l'on recherche
    {
    long i = 0, j = 0;
    char ch2[50]; // Si on change ici 50 par 100 le programme fonctionne

    while (ch[i] != c && ch[i] != '\0') // Tant que (c n'est pas trouvée ET non(fin de ch))
    i++;

    if (ch[i] == c) // Si (lettre trouvée)
    {
    while (ch[i] != '\0') // On remplit la chaine ch2(de j = 0) par ch(depuis i = la position de la lettre trouvée)
    {
    ch2[j] = ch[i];
    i++;
    j++;
    }
    ch2[j] = '\0';
    return ch2;// Sans oublier le symbole de fin de chaîne
    }
    else // Sinon si (fin de ch atteinte)
    return 0; // On retourne NULL
    }

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      12 août 2008 à 17:05:39

      ch2 est une variable locale. L'adresse de celle-ci est donc invalide à l'extérieur de la fonction...
      • Partager sur Facebook
      • Partager sur Twitter
        12 août 2008 à 17:37:26

        comme dit ice_keese, ch est détruit en sortant de ta fonction : son adresse devient invalide.

        Conseil :
        construit ch2 dynamiquement, avec un malloc. Dans ce cas la, tu retournes le pointeur, et la chaine reste valide. Il ne faudra pas oublier de la détruire plus tard a coup de free.

        Alternative (déconseillée) : place "static" devant la déclaration de char ch2[], qui rend le tableau persistant (l'adresse existera donc toujours en sortant), mais attention, si tu rerentres dans la fonction, c'est le meme buffer qui sera utilisé, donc il faut prendre des précautions sur les appels. [...]


        Sinon, autre chose :
        tu places un moment un "return 0;"
        je te conseille vivement de mettre :
        "return NULL;"

        ça fera la meme chose, mais au niveau lisibilité, c'est beaucoup mieux et ça évite les confusions.
        • Partager sur Facebook
        • Partager sur Twitter

        Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

          13 août 2008 à 22:28:32

          Ok, voiçi le code avec les balises :

          char* strchr2(const char* ch, int c) // c représente la lettre que l'on recherche
          {
          long i = 0, j = 0;
          char ch2[50]; // Si on change ici 50 par 100 le programme fonctionne
          
          while (ch[i] != c && ch[i] != '\0') // Tant que (c n'est pas trouvée ET non(fin de ch))
          i++;
          
          if (ch[i] == c) // Si (lettre trouvée)
          {
          while (ch[i] != '\0') // On remplit la chaine ch2(de j = 0) par ch(depuis i = la position de la lettre trouvée)
          {
          ch2[j] = ch[i];
          i++;
          j++;
          }
          ch2[j] = '\0';
          return ch2;// Sans oublier le symbole de fin de chaîne
          }
          else // Sinon si (fin de ch atteinte)
          return 0; // On retourne NULL
          }
          


          Merci pour les réponses mais c'est quoi un malloc ?
          Et puis normalement, je ne renvoie pas la variable elle-même à la sortie d'une fonction, mais la valeur de cette dernière quand je mets :
          return ch2;
          

          En d'autres termes, c'est comme si j'affecter la valeur de la variable à la sortie de la fonction lors de son appel et non la variable elle même, c'est la valeur à la sortie qui est envoyée. Est-ce que c'est comme ça que ca marche, ou est-ce que je me trompe ?
          Merci d'avance. :)
          • Partager sur Facebook
          • Partager sur Twitter
            13 août 2008 à 22:30:11

            ch2 est un char *. Tu renvoies donc un pointeur.
            • Partager sur Facebook
            • Partager sur Twitter
              13 août 2008 à 22:32:23

              Citation : Squall-25

              Voiçi le code commenté de la fonction :

              char* strchr2(const char* ch, int c) // c représente la lettre que l'on recherche
              {
              long i = 0, j = 0;


              Code en vrac détecté...


              Merci de lire les règles du forum avant de poster.
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
              Anonyme
                13 août 2008 à 23:47:13

                Citation : -ed-

                Citation : Squall-25

                Voiçi le code commenté de la fonction :

                char* strchr2(const char* ch, int c) // c représente la lettre que l'on recherche
                {
                long i = 0, j = 0;


                Code en vrac détecté...



                Merci de lire les règles du forum avant de poster.



                Histoire de ne lire que le premier post du topic et de se répéter pour rien...
                • Partager sur Facebook
                • Partager sur Twitter

                Une erreur bizarre

                × 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