IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Coder la fonction strstr


Sujet :

C

  1. #21
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Ah oui tu as raison

    Ca serait strncmp(s1, s2, strlen(s2)), mais il faudrait stocker strlen(s2) pour éviter de le réappeler à chaque fois.

    Sinon pour optimiser tu peux implémenter la comparaison dans la méthode mais dans ce cas-là au lieu de faire varier s1 et s2 pour faire une comparaison caractère à caractère il faut copier s1 et s2 dans deux pointeurs temporaires et faire varier ceux-ci.

    Enfin dans un premier temps fais la première version!

  2. #22
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Tu peux essayer de coder l'algo suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    1- si s2 est vide, retourner s1 (C'est la norme!)
    
      Pour l'analyse de la chaine, on va simultanément parcourir les deux chaines
      à partir de s1 et s2 :
    2- Tant que s1 n'est pas à la fin de la chaine :
      2-1- initialiser un pointeur sp1 avec s1 
      2-2- initialiser un pointeur sp2 avec s2
      2-3- Tant que le caractère pointé par sp1 est égal au caractère pointé par sp2
           et que l'on est pas arrivé à la fin de l'une des deux chaines : 
           incrémenter sp1 et sp2
      2-4- Si le caractère pointé par sp2 est alors le caractère de fin de chaine,
           la sous-chaine a été trouvée : retourner s1
      2-5- Sinon, analyser la chaine à partir du caractère suivant : incrémenter s1
    
    3- La sous chaine n'a pas été trouvée : retourner NULL

  3. #23
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par défaut
    Pour l'algo de diogene je tombe sur cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    char *c_strstr (const char *s1, const char *s2)
     {
         const char *ps1=s1;
         const char *ps2=s2;
     
         if(*ps2==NULL)
          {
              return ps1;
          }
     
         while(*ps1++)
          {
              for(*ps1; *ps1!=0; *ps1++)
               {
                   for(*ps2; *ps2!=0; *ps2++)
                    {
                        /**
                        while( (*ps1==*ps2) && (*ps1!=0 || *ps2!=0) )
                        
                        {**/
     
     
                   if(*ps2==0)
                    {
                        return ps1;
                    }
     
                   else
                    {
                        *ps1 ++;
                    }
     
                   //                *ps1++;
                   //*ps2++;
               }
         } }
     
        return NULL;
     }
    Où sont les erreurs?

  4. #24
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    L'initialisation est dans la boucle, pas en dehors.

    Les pointeurs ps1 et ps2 ne devraient pas exister en dehors de la boucle.

  5. #25
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par défaut
    Pourquoi ca, ne marche pas?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Initialisation...
    int comp = strncmp(s1,s2,size);
    // Code..
    if(comp==0)
    // Code...
    Et que cela marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(strncmp(s1,s2,size)
    //Code...

  6. #26
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Ca ne serait pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strncmp(s1,s2,size)==0)
    Sinon poste un code complet qui ne marche pas..........

  7. #27
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par défaut
    Tout est bon, merci !

    Ps les doc sur comme celle de string.h y'en a sur tout? =p

  8. #28
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Il y a une doc ici:

    http://www.cppreference.com/wiki/c/start

    Il y en a plein d'autres (linux man pages, ...)

  9. #29
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par Ququbs Voir le message
    Pour l'algo de diogene je tombe sur cela:...

    Où sont les erreurs?
    Tu ne respectes pas l'algo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    char *c_strstr (const char *s1, const char *s2)
    {
       const char *ps1;
       const char *ps2;
       //1- si s2 est vide, retourner s1 (C'est la norme!)
       if(*s2 == 0) return s1;
       //  Pour l'analyse de la chaine, on va simultanément parcourir les deux chaines
       //  à partir de s1 et s2 :
       //2- Tant que s1 n'est pas à la fin de la chaine :
       while(*s1 !=0)
       {
           //  2-1- initialiser un pointeur sp1 avec s1
           ps1 = s1;
           //  2-2- initialiser un pointeur sp2 avec s2
           ps2 = s2;
           //  2-3- Tant que le caractère pointé par sp1 est égal au caractère pointé par sp2
           //       et que l'on est pas arrivé à la fin de l'une des deux chaines :
           //       incrémenter sp1 et sp2
           while(*ps1== *ps2 && *ps1 !=0 && *ps2 != 0)
           {
             ps1++;
             ps2++;
           }
           //  2-4- Si le caractère pointé par sp2 est alors le caractère de fin de chaine,
           //       la sous-chaine a été trouvée : retourner s1
           if(*ps2==0) return s1;
           //  2-5- Sinon, analyser la chaine à partir du caractère suivant : incrémenter s1
           s1++;
        }
        // 3- La sous chaine n'a pas été trouvée : retourner NULL
        return NULL;
    }

  10. #30
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 31
    Par défaut
    C'est bon tout fonctionne merci =)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 10
    Dernier message: 29/02/2008, 16h45
  2. Coder la fonction Ctrl + F ?
    Par bebertol dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/10/2007, 15h35
  3. aide pour coder la fonction who de unix
    Par aimad41 dans le forum Linux
    Réponses: 4
    Dernier message: 21/12/2006, 09h29
  4. fonction strstr ou autre chose
    Par perlgirl dans le forum Langage
    Réponses: 1
    Dernier message: 18/09/2006, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo