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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Coder la fonction strstr
    Bonjour,

    Je suis entrain de recoder moi même certaine fonction de string.h, afin de verifier mes connaissance et ma compression de leurs effets.

    Néanmoins je bloque sur la fonction strstr, qui chercher une chaîne de caractères dans une chaîne de caractères.

    Voici mon code:

    Code c : 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
     
    int main(int argc, char *argv [])
     {
         char *Next_String;
     
         Next_String = String_In_String ("Petit texte de test", "test");
     
         if (Next_String != NULL)
          {
              printf("L'occurrence est : %s.\n", Next_String);
          }
     
     
        return 0;
     }
     
    int Size_String (char *String)
     {
         char Character = 0;
         int Number_Of_Character = 0;
     
         do
          {
              Character = String [Number_Of_Character];
              Number_Of_Character ++;
          } while(Character != '\0');
     
        return Number_Of_Character;
     }
    int Comp_String (const char *String_1, const char *String_2)
     {
         int Size = 0, Size_1 = 0, Size_2 = 0, Comp = 0, i;
     
         Size_1 = Size_String (String_1);
         Size_2 = Size_String (String_2);
     
         Size = Size_1 - Size_2;
     
         if (Size == 0)
          {
              for(i=0; i<Size; i++)
               {
                   if (String_1 [i] == String_2 [i])
                    {
                        Comp = 0;
                        //printf("Les chaines sont identiques.\n\n");
                        return Comp;
                    }
               }
          }
     
         else
          {
              if (Size > 0)
               {
                   Comp = 1;
                   printf("Les chaines sont differentes, la premiere etant plus grande que la seconde.\n\n");
                   return Comp;
               }
     
              if (Size < 0)
               {
                   Comp = -1;
                   printf("Les chaines sont differentes, la premiere etant plus petite que la seconde.\n\n");
                   return Comp;
               }
          }
     }
     
    char *String_In_String (const char *String_1, const char *String_2)
     {
         int Size = 0, Size_1 = 0, Size_2 = 0, Comp = 0, i, k;
         char *Occurrence = 0;
     
         Size_1 = Size_String (String_1);
         Size_2 = Size_String (String_2);
     
         Comp = Comp_String (String_1, String_2);
     
         for(i=0; i<Size_1; i++)
          {
              for(k=0; k<Size_2; k++)
               {
                   if ( (String_1 [i] == String_2 [k]))
                    {
                        return String_1 - Size_2;
                    }
               }
          }
     
        return NULL;
     }

    De plus si quelqu'un connais des exo (corrigés de preference) sur les pointeurs ca m'aiderait pas mal je pense =), merci.

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Ququbs Voir le message
    Je suis entrain de recoder moi même certaine fonction de string.h, afin de verifier mes connaissance et ma compression de leurs effets.

    Néanmoins je bloque sur la fonction strstr, qui chercher une chaîne de caractères dans une chaîne de caractères.
    Je t'invite à jeter un œil à Etude détaillée du module String de la libc qui pourrait te donner des pistes.

  3. #3
    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
    Sinon tu trouve que ma fonction Comp_String est fausse, car on me signale que oui mais je vois pas l'erreur même avec la doc détaillée.

    Mais sinon une truc que je comprend pas pourquoi dans la fonction il:

    char * c_strstr (const char * s1, const char * s2)
    {
    const char * p_s1 = s1;

    Alors que S1 est déjà un pointeur?

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Ququbs Voir le message
    Sinon tu trouve que ma fonction Comp_String est fausse, car on me signale que oui mais je vois pas l'erreur même avec la doc détaillée.
    Oui, au moins trois problèmes :
    • Si la taille des deux chaînes, tu retournes une valeur dépendant de l'ordre relative des tailles et non de l'ordre lexicographique, contrairement à strcmp().
    • Si les tailles sont égales, Size vaut 0, donc la boucle for(i=0; i<Size; i++) est équivalente à for(i=0; i<0; i++) et donc aucune itération n'a lieu et la comparaison n'a pas lieu.
    • Même en supposant que la boucle est bonne (itération sur la taille des chaînes et non sur Size qui vaut 0), tu retournes 0 dès qu'un caractère est identique et donc avec cette boucle, "maison" est égale à "meuble" ainsi qu'à "tables".



    Citation Envoyé par Ququbs Voir le message
    Mais sinon une truc que je comprend pas pourquoi dans la fonction il:

    char * c_strstr (const char * s1, const char * s2)
    {
    const char * p_s1 = s1;

    Alors que S1 est déjà un pointeur?
    C'est un choix d'implémentation et je ne connais pas les raisons de ce choix.
    Ce code aurait fonctionné en utilisant directement le pointeur s1, modification qui aurait été purement locale à la fonction vu que le pointeur est passé par valeur.
    Ceci dit, à titre personnel, je n'aime pas trop utiliser les paramètres d'une fonction (même lorsqu'ils sont passé par valeur) en guise de compteur ou autre mécanisme du même style, trop de risque de modifier quelque chose qu'il ne faut pas et plus complexe en général à faire évoluer.

  5. #5
    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
    Bon je vais refaire toutes mes fonctions alors, tu voudras bien jeter un coup d'oeil aprés? x)

    Et si j'ai bien compris:

    // Tant que String != '\0' <=> // Tant que *String ?

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Ququbs Voir le message
    Et si j'ai bien compris:

    // Tant que String != '\0' <=> // Tant que *String ?
    Si String est un pointeur sur un caractère alors, dans une condition *String != '\0' est équivalent à *String.
    Je te conseille la première notation qui est plus facile à lire.

+ Répondre à la discussion
Cette discussion est résolue.

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