Partage
  • Partager sur Facebook
  • Partager sur Twitter

fonction strchr

Sujet résolu
    26 février 2006 à 18:29:26

    Bonjour!
    Comme M@téo le conseil dans son cour sur les chaînes de caractères et comme un bon petit Zéro qui se respect j'ai essayé de refaire les fonctions de string.h.
    Pas de problème jusqu'à strchr... et j'en arrive justement à mon petit problème :(

    Je n'arrive pas à faire passer le bout de chaîne qui resulte du découpage à partir du caractère choisi.Dans la fonction ça marche mais je n'arrive à sortir qu'une seule lettre... la première.

    voici le code de ma fonction:
    La fonction :

    long rechercheCaractere(char chaine[], char lettre)
    {
    //déclaration des variables
    char morceauChaine[1000]={0};/*Alors ici je me demande ce qu'il arrive si on cherche une lettre dans un texte entierpuisqu'il faut définir la taille de la chaîne...?Comment faire pour se passer de cette chaine  ?*/

    long longueur=0, i=0,j=0;
    char caractereActuel =0;

    // Trouver la longueur de la chaîne initiale
    do
            {
            caractereActuel =chaine[longueur];
            longueur++;
            }
            while (caractereActuel !='\0');

    //Trouver le caractère choisi puis mettre le morceau de chaîne qui suit dans morceauChaine.

    for (i=0;i<longueur;i++)
            {
              if (chaine[i]==lettre)
              {
                  for (i=i;i<longueur;i++)
                  {
                  morceauChaine[j]= chaine[i];
                  j++;

                  }
              }
            }
    //Vérification --> ici dans la fonction c'est correct
    printf("\n%s",morceauChaine);

    //Et on retourne quoi ??????
    return *morceauChaine;
    }


    Code dans la fonction main :

    char chaine[100]="Ici j'avais mis une chaine de caracteres";/* j'ai donné une taille à la chaine parce que j'en avais besoin pour tester une autre fonction qui marche (merci pour elle )*/
    char morceauChaine[1000]={0};
    .
    .
    .
    // Rechercher un caractère dans une chaîne
    *morceauChaine=rechercheCaractere(chaine, 'q');

    printf("\n %s",morceauChaine);//vérification et ça marche pas!! Une seule lettre!
    return 0;

    Merci pour votre réponse !! :):p

    Ah oui aussi en passant, pour M@téo: un énorme merci pour ce cour génial plein d'humour et d'une pédagogie à faire pâlir les agrégés et désagrégés de France et de Navar... Je lis ce cour comme un bon bouquin, je me régale! :)
    • Partager sur Facebook
    • Partager sur Twitter
      26 février 2006 à 19:13:00

      Utilise la balise code, sinon on peut pas lire correctement ton code.

      mleg==>Le but c'est justement de ne pas utiliser string.h. A la limite il peut utiliser sa propre fonction strcat mais bon...je crois pas que ce soit ce qui était prévu^^
      • Partager sur Facebook
      • Partager sur Twitter
        26 février 2006 à 19:50:51

        Oui m'enfin... c'est plus court ^^
        • Partager sur Facebook
        • Partager sur Twitter
          26 février 2006 à 20:09:57

          Oui Azerty ... j'ai vu ... trop tard et je ne pouvais plus éditer mon message. Désolée ..j'apprends vite, je ne le referai plus ! :p (je crois ???) :-°

          Sinon mleg je reconnais que ça serait plus facile avec strcat mais je n'apprendrais pas grand chose je pense... le but du jeu c'est justement, ne pas se servir des fonctions de la bibliothèque je crois.

          ET pour finir ce n'est pas il mais c'est elle ! :)

          Merci pour les réponses... j'attends la suite...à bientôt !!

          • Partager sur Facebook
          • Partager sur Twitter
            26 février 2006 à 20:12:09

            Acryline, j'avoue j'ai pas regardé ton code ;
            il est tard, tu l'as pas coloré,indenté donc il est illisible.
            Pour coder strchr (), tu parcoures la chaine, tant que le caractère i n'est pas égal à celui passé en paramètre tu continues :)
            • Partager sur Facebook
            • Partager sur Twitter
              26 février 2006 à 20:15:28

              Tu peux éditer ton premier message (et ça serait bien pour les balises code, d'autant plus qu'on n'a pas l'indentation là)
              • Partager sur Facebook
              • Partager sur Twitter
                26 février 2006 à 20:49:06

                Je m'y mets tout de suite... je n'avais pas vu le petit crayon pour éditer :-° Désolée...

                J'avais tout refais mon message et remis le code au clair et mon PC à planté ! je dois tout refaire. :colere:

                ALlez courage! :(
                • Partager sur Facebook
                • Partager sur Twitter
                  27 février 2006 à 12:25:55

                  Coucou.. j'ai présenté mon code de façon lisible maintenant... si qq'un peut venir m'aider ça serait sympa merci :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 février 2006 à 13:18:40

                    Tu ne peux pas retourner un tableau. Déclare ta fonction comme void et supprime la ligne du return.

                    [e:]Le prototype est le suivant :
                    char* strchr(const char*, int);

                    ... et non :
                    long strchr(const char*, int);
                    [/e]
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 février 2006 à 13:46:04

                      En plus de ça :
                      - la fonction de calcul de longueur de la chaîne n'est pas bon.
                      Tu détermines caractereActuel (qui ne sert d'ailleurs à rien) à l'intérieur de la boucle, ce qui fait une itération en trop. La condition du while doit être chaine[longueur] != '\0' (et puis un for ça serait plus joli, enfin bon ^^ )
                      - fais une fonction séparée pour le calcul de la longueur de la chaîne
                      - Tu mélanges tableaux et pointeurs, ce n'est pas bon. Ta boucle est inutilement compliquée, elle doit seulement retourner l'adresse du caractère égal à 'lettre'. Fonctionne avec *(str+n) au lieu de str[n] si ça peut te sembler plus clair.
                      morceauChaine devient inutile, bien sûr.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 février 2006 à 14:00:51

                        Yeah enfin mélanger tableaux et pointeurs on peut pas faire autrement (oui oui je cherche la petite bête ^^ ).

                        ++.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 février 2006 à 22:07:21

                          Je ne disais pas ça dans ce sens (encore que si, on peut très bien tout faire autrement :p ), je pensais plutôt à un mélange dans la compréhension des deux.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 mars 2006 à 13:22:16

                            Ceci dit le code pour trouver la longueur de la chaîne vient en droite ligne du cour de M@athéo ... et il marche.


                            long nombreDeCaracteres = 0;
                                char caractereActuel = 0;

                                do
                                {
                                    caractereActuel = chaine[nombreDeCaracteres];
                                    nombreDeCaracteres++;
                                }
                                while(caractereActuel != '\0')


                            Peut être que :
                            while (chaine[nombreDeCaracteres]!='\0') serait plus joli ok mais je pense que quand on code depuis même pas une semaine on a encore le temps de penser à mettre des fleurs sur la table... :-°

                            Sinon tout ça c'est bien beau... et elle a quelle tête la fonction qui marche alors ? :)
                            Sinon pas grave si vous ne savez pas... dans quelques temps j'y retournerai et je vous dennerai la solution, promis ..ok ? :p


                            • Partager sur Facebook
                            • Partager sur Twitter
                              1 mars 2006 à 13:45:40


                              <mode = "CORRECTEUR D'ORTHOGRAPHE"> :lol:

                              Citation : Acryline

                              comme un bon petit Zéro qui se respect



                              qui se respectE ! :p

                              </mode>
                              • Partager sur Facebook
                              • Partager sur Twitter
                                1 mars 2006 à 15:05:54

                                Justement non, ce code ne marche pas, et le changement de condition dans le while ce n'est vraiment pas pour faire joli :p
                                Là ton résultat est faux.

                                Je viens de vérifier dans le cours de M@téo, en effet la boucle est identique... hormis que juste après, il y a
                                nombreDeCaracteres--;
                                et sans ça le résultat est faussé, vu qu'on fait une itération en trop sur le \0

                                Pour la fonction qui marche tu devrais pouvoir te débrouiller avec ce que je t'ai dit si tu as compris les pointeurs, ta fonction doit retourner l'adresse du caractère qui correspond au caractère donné en argument.

                                PianoPâriss > Hum poster pour dire ça, ça fait un peu flood, attention...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 mars 2006 à 15:08:02

                                  Et en mode mode <aide> on peut avoir qq chose ? :)

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    1 mars 2006 à 15:09:47


                                    Désolé ; Je vais cherché en mode aide :)

                                    A++
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 mars 2006 à 15:28:53

                                      Citation : Elentar

                                      Justement non, ce code ne marche pas, et le changement de condition dans le while ce n'est vraiment pas pour faire joli :p
                                      Là ton résultat est faux.

                                      Je viens de vérifier dans le cours de M@téo, en effet la boucle est identique... hormis que juste après, il y a
                                      nombreDeCaracteres--;
                                      et sans ça le résultat est faussé, vu qu'on fait une itération en trop sur le \0

                                      Pour la fonction qui marche tu devrais pouvoir te débrouiller avec ce que je t'ai dit si tu as compris les pointeurs, ta fonction doit retourner l'adresse du caractère qui correspond au caractère donné en argument.

                                      PianoPâriss > Hum poster pour dire ça, ça fait un peu flood, attention...



                                      Pour ce qui est du code de M@téo..j'ai fait un copier coller .Comme je ne cherchais pas le nombre de catactères de la chaîne mais plutôt à recoller tous les morceaux même le symbole de fin, je n'ai pas utilisé nombreDeCaracteres--;... passons le problème n'est d'ailleurs pas là.

                                      Effectivement je vais me débrouiller toute seule, relire un coup le cour et m'y remettre. Mais j'avais simplement pensé que qq'un allait pouvoir mettre directement et simplement le doigt sur ce qui n'allait pas dans mon tout petit code.
                                      Désolée je me suis trompée, je ne vais plus perdre de temps la prochaine fois.. :( ..et vous non plus ;)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        1 mars 2006 à 15:37:57

                                        Pour la longueur de la chaîne je trouve plus logique d'imiter le fonctionnement de strlen(), vu que le caractère \0 ne te sert strictement à rien pour ta fonction, après c'est sûr ce n'est pas *grave*... ;)

                                        Concernant ton problème ça ne serait pas te rendre service de te donner un code tout fait.
                                        Si ton problème était une erreur de syntaxe, là on aurait pu te dire "il manque une parenthèse". Là c'est un problème d'algorithmique. Il faut forcément réflechir un peu plus.
                                        Je t'ai déjà dit que le problème se trouvait dans ta seconde boucle qu'il fallait simplifier et faire retourner une adresse, et ça c'est presque du pseudo-code... Après à toi de réflechir, parce que si tu as du mal à trouver ce qu'il faut faire pour un algorithme aussi simple, tu vas avoir beaucoup de mal par la suite...
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        fonction strchr

                                        × 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