Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Refaire les fonctions strcpy et strchr

Je rame

Sujet résolu
    11 mars 2006 à 11:26:27

    Bonjour,
    J'ai lus le chapitre sul les chaines de caractères. A la fin mateo propose de refaire les fonctions qu'il vient de montrer de string.h. Moi en bon zero je le fais et là probleme. Depuis quatre jours j'essaye de refaire les fonctions strcpy et strchr et je n'y arrive pas. J'ai beau retourner le probleme dans tout les sens à chaque fois ça ne marche pas. Si vous pourriez m'aider en me donnant une piste ou autre ce serait gentils. Merci.
    P.S: on ecrit "ce" ou "çe" j'ai un doute tout d'un coup :)
    • Partager sur Facebook
    • Partager sur Twitter
      11 mars 2006 à 12:22:55

      Citation : newJohnCarmack

      Depuis quatre jours j'essaye de refaire les fonctions strcpy et strchr et je n'y arrive pas.


      Montre ton code.
      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        11 mars 2006 à 12:52:17

        Voila j'en ai tester plein d'autre mais je vous montre celui la qui marche pas.
        #include <stdio.h>
        #include <stdlib.h>

        char* strcpy(char* copieDeLeChaine‚ const char* chaineACopier);

        int main(int argc‚ char *argv[])
        {
           
            char chaine[] = "Texte"‚ copie[100] = {0};

            strcpy(copie‚ chaine); // On copie "chaine" dans "copie"

            // Si tout s'est bien passé‚ la copie devrait être identique à chaine
            printf("chaine vaut : %s\n"‚ chaine);
            printf("copie vaut : %s\n"‚ copie);


            return 0;
        }

        char* strcpy(char* copieDeLeChaine‚   const char* chaineACopier)
        {
            char copieDeLaChaine[100] = {0};
            const char chaineAcopier;



            copieDeLaChaine = chaineACopier;

            return 0;

        }


        • Partager sur Facebook
        • Partager sur Twitter
          11 mars 2006 à 13:27:37

          Citation : newJohnCarmack

          Voila j'en ai tester plein d'autre mais je vous montre celui la qui marche pas.


          Ok. Le problème est simple. Il te manque la théorie.

          Le chaines en C sont définies de la façon suivante :

          Tableau de char initialisé avec des caractères et terminé par un 0.

          Par exemple :
          char s[] = "hello"

          est en fait
          char s[] = {'h''e''l''l''o'0};

          D'une façon générale, il n'y a pas d'opérateur en C pour copier des tableaux.
          Pour copier une chaine (qui est un tableau de char), il faut donc copier chaque élément un par un. Les éléments étant des types simples, on peut utiliser l'opérateur d'affectation '='.

          Bien sûr, l'usage d'une boucle s'impose...
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
          Anonyme
            11 mars 2006 à 14:37:33

            En effet, tu vas devoir copier chaque caractère un par un à l'aide d'une boucle. Relis bien le cours pour savoir quoi mettre dans la boucle et quand l'arrêter.

            Autre petit conseil pas important : évites de nommer ta fonction strcpy, ça pourrait poser des problèmes, nommes la plutôt my_strcpy comme ça t'auras pas de conflits au linker ou autres trucs du genre ;)
            • Partager sur Facebook
            • Partager sur Twitter
              11 mars 2006 à 14:57:53

              une fonction peut-elle renvoyer un pointeur? ô_o
              • Partager sur Facebook
              • Partager sur Twitter
                11 mars 2006 à 15:09:36

                Citation : V1944

                une fonction peut-elle renvoyer un pointeur? ô_o


                Pas très clair... Une fonction peut renvoyer une adresse si son retour est de type pointeur. Pour être exploitable, cette adresse doit être valide après exécution de la fonction. (Ce qui exclue évidemment l'adresse d'un variable locale).


                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  11 mars 2006 à 17:13:04

                  Merci. Ca marche impecable. :)
                  Mais je pose donc la question suivante:
                  Comment ceux qui ont ecris la fonction on put prevoir la taille de la chaine, car moi j'ai fais ça:
                  char* my_strcpy(char* copieDeLeChaine‚   const char* chaineACopier)
                  {
                      char copieDeLaChaine[100] = {0};
                      const char chaineAcopier;



                      copieDeLaChaine[0] = chaineACopier[0];
                      copieDeLaChaine[1] = chaineACopier[1];
                      copieDeLaChaine[2] = chaineACopier[2];
                      copieDeLaChaine[3] = chaineACopier[3];
                      copieDeLaChaine[4] = chaineACopier[4];
                      copieDeLaChaine[5] = chaineACopier[5];
                      return 0;

                  }

                  Mais je connaissais d'avance la taille, alors eux comment peuvent ils savoir. J'aurais très bien pus vouloir copier une chaine de 2000 caracteres.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    11 mars 2006 à 17:15:47

                    - en faisant une boucle
                    - en se servant du caractere de fin de chaine '\0'
                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 mars 2006 à 17:26:17

                      téoriquement ce brobleme est deja abordé si tu as lu le cours sur les tableau de mateo notament si tu a fait l'execrcice n°3 portant sur la poy de tableau
                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 mars 2006 à 18:42:01

                        Et je voudrais savoir, quand je tape #include <string.h>, normalement je suis sensé donner a l'ordinateur les parametres de la fonctions que je vais utilisé(disons strchr) mais quand je fais:
                        suiteChaine = strchr(chaine‚ 'd');

                        Comment peut il connaitre ce que la fonction fait puisque je lui ai juste "envoyer" les prototypes?
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          11 mars 2006 à 19:16:35

                          Ta question est un peu tordue.

                          En incluant <string.h> le prototype est inclus dans ton fichier, donc le code peut être complier. Puis c'est le linker, qui va aller chercher le code de la fonction, déja compilée, pour la réunir avec ton fichier compilé et sortir le fichier exécutable.

                          Et pour le reste, il faut utiliser des boucles, ça sert à ça.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 mars 2006 à 19:18:55

                            suiteChaine = Foncton(valeurs)

                            ce n'est pas un prototype, il est definit dans le header la tu fait appelle a une fonction deja defini
                            • Partager sur Facebook
                            • Partager sur Twitter
                              11 mars 2006 à 20:41:34

                              Citation : newJohnCarmack


                              Mais je pose donc la question suivante:
                              Comment ceux qui ont ecris la fonction on put prevoir la taille de la chaine,


                              Le fonction de copie n'a pas besoin de prévoir la taille de la chaine. Il suffit de boucler en surveillant le caractère 0 qui marque la fin de la chaine.

                              Citation : newJohnCarmack


                              car moi j'ai fais ça:


                              char* my_strcpy(char* copieDeLeChaine‚   const char* chaineACopier)
                              {
                                  char copieDeLaChaine[100] = {0};
                                  const char chaineAcopier;

                                  copieDeLaChaine[0] = chaineACopier[0];
                                  copieDeLaChaine[1] = chaineACopier[1];



                              Il n'y a pas besoin de ces tableaux locaux. La fonction fourni des paramètres qui sont respectivement
                              • l'adresse du tableau de destination
                              • l'adresse du tableau source

                              Ces paramètres sont des pointeurs sur char. On peut donc les utiliser avec des indices comme des tableaux comme tu l'avais imaginé :

                                  copieDeLaChaine[0] = chaineACopier[0];
                                  copieDeLaChaine[1] = chaineACopier[1];

                              etc.
                              sauf qu'on va utiliser un index variable (int i, par exemple) et une boucle :

                              LOOP:
                                  copieDeLaChaine[i] := chaineACopier[i]
                                  i := i + 1
                              LOOPEND

                              Evidemment ce n'est pas du C correct, et il manque une condition pour arréter la boucle.

                              A toi d'écrire le bon code.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                12 mars 2006 à 20:15:08

                                Bonjour, c'est encore moi.
                                Après avoir éclater de joie quand j'ai réussi à écrire la fonction strcpy et que j'ai pus enfin comprendre ce qu'avait ressenti les personnes ayant programmer farcry quand leur jeux fut terminer :-° , je me suis attaquer de suite à la fonction strchr. Mais là quel ne fut pas ma surprise quand je vis le main que proposait mateo21:
                                int main(int argc‚ char *argv[])
                                {
                                    char chaine[] = "Texte de test"‚ *suiteChaine = NULL;

                                    suiteChaine = strchr(chaine‚ 'd');
                                    if (suiteChaine != NULL) // Si on a trouvé quelque chose
                                    {
                                        printf("Voici la fin de la chaine a partir du premier d : %s"‚ suiteChaine);
                                    }

                                    return 0;
                                }

                                J'aimerais savoir pourquoi, mis à part le premier "*suiteChaine", les autres ne possedait pas l'etoile "*".
                                Cela viendrait il de moi qui n'est pas bien suivit un chapitre(ce que je pense) ou bien y aurait il une faute de frappe(ce dont je doute).
                                Merci d'avance de vos réponses :) .
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  12 mars 2006 à 20:40:20

                                  Citation : newJohnCarmack

                                  J'aimerais savoir pourquoi, mis à part le premier "*suiteChaine", les autres ne possedait pas l'etoile "*".


                                  C'est peut être le moment de revoir le chapître sur les pointeurs...

                                  D'autres explications ici:

                                  http://mapage.noos.fr/emdel/notes.htm#pointeurs
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Music only !
                                    12 mars 2006 à 22:01:00

                                    Tu as visiblement des lacunes théoriques en effet, je ne saurais trop te conseiller de relire le chapitre sur les pointeurs. T'y es passé trop vite alors que c'est très important, c'est clair et net.

                                    Ne va pas plus loin tant que t'es pas sûr d'avoir bien compris les pointeurs.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

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

                                    [C] Refaire les fonctions strcpy et 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