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 :

comparaison avec strcmp


Sujet :

C

  1. #1
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut comparaison avec strcmp
    Bonjour,

    je souhaite trouver toutes les occurences d'un mot et de renvoyer les lignes qui le contiennent.
    Voici ma fonction:
    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
         void trouver(char *qui)
    {
        int fd;
        int i,n=0;
        char a;
        char ligne[512];
        char *test;
        test=malloc(50);
    if(test==NULL) { perror(""); exit(1);}
        fd=open("database",O_RDONLY);
        if(fd==-1)
        {
            perror("echec lors de l'ouverture de la base de donnees");
            exit(1);
        }
        while((i=read(fd,&a,1))>0)
        {
            if(a!='\n')
            {
                strcat(ligne,&a);
            }
            else
            {
                strcat(ligne,"\0");
                 test=strrchr(ligne,'/');
                  printf("on compare avec :%s \n",test+1);
                 printf("on recherche :%s \n",qui);
                if(strcmp(test+1,qui)==0)
                {
                    printf("%s\n",ligne);
                    n++;
                }
        
                 bzero(test,strlen(test));
                 bzero(ligne,strlen(ligne));
            }
        }
        printf("\n%d files found\n\n",n);
    }
    mais lors de l'execution, j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    on recherche :Aide.txt
    on compare avec :screen.gif
    on recherche :Aide.txt
    on compare avec :Aide.txt
    on recherche :Aide.txt
    on compare avec :Affiche.class
     
    0 files found
    je ne vois pas d'où l'erreur provient.
    les chaînes se teminent toutes les deux par 0
    Wer nicht probiert, verliert !!

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,

    Au premier tour de boucle, ligne n'étant initialisé, il peut arriver n'importe quoi.

    ça ne serait pas plus simple d'utiliser fopen, fgets et strchr ?

    Question bête : les mots recherchés sont bien présents dans le fichier ?

  3. #3
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    j'ai initialisé ligne maintenant.
    les mots recherchés setrouvent bien dans le fichier puisqu' il me les imprime a l'écran.
    J'ai essayé avec fgets, mais je pense que je ne l'utilise pas bien.
    ligne reste blanc à l'écran en executant.
    voici le code avec les fcts de la lib std.
    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
             void trouver(char *qui)
    {
        FILE *fd;
        int n=0;
        char ligne[512]="";
        fd=fopen("database","r");
        if(fd==NULL)
        {
            perror("echec lors de l'ouverture de la base de donnees");
            exit(1);
        }
        while(fgets(ligne,sizeof ligne,fd)!=NULL)
        {    
            char *p = strchr (ligne, '\n');
            if (p != NULL)
            {
            *p = 0;
            }
            printf("ligne: %s \n",ligne);
            printf("\tqui  : %s \n",qui);
            if(strncmp(ligne,qui,sizeof(qui))==0)
            {
                printf("%s\n",ligne);
                n++;
            }
            bzero(ligne,strlen(ligne));
        }
        printf("\n%d files found\n\n",n);
    }
    et voici la sortie en donnant client.c en argument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ligne:
            qui  : client.c
    ligne:
            qui  : client.c
    ligne:
            qui  : client.c
    ligne:
            qui  : client.c
    ligne:
            qui  : client.c
    ligne:
            qui  : client.c
    ligne:
    Wer nicht probiert, verliert !!

  4. #4
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    mais avec les primitives systèmes ' open et read ' ,
    ça devrait marcher, puisque les chaines imprimés sont les mêmes
    Wer nicht probiert, verliert !!

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par je®ome
    mais avec les primitives systèmes ' open et read ' ,
    ça devrait marcher, puisque les chaines imprimés sont les mêmes
    Ca sert à quoi d'utliser autre chose que les fonctions standards dans le cas présent ?
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Voilà un code qui fonctionne :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <errno.h>
     
    void trouver(const char *qui)
    {
      FILE *fd;
      int n = 0;
      char ligne[512] = "";
     
      errno = 0;
      fd = fopen ("main.c","r");
      if (fd)
      {
        while (fgets (ligne, sizeof (ligne), fd))
        {
          if (strstr (ligne, qui))
          {
            printf("ligne : %s\n",ligne);
            n++;
          }
        }
        printf("\n%d lines found\n",n);
      }
      else
      {
        perror ("echec lors de l'ouverture de la base de donnees");
      }
    }
     
    int main (void)
    {
      trouver ("printf");
      return 0;
    }
    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ligne :         printf("ligne : %s\n",ligne);
     
    ligne :     printf("\n%d lines found\n",n);
     
    ligne :   trouver ("printf");
     
     
    3 lines found
    Des questions ?

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par je®ome
    Bonjour,

    je souhaite trouver toutes les occurences d'un mot et de renvoyer les lignes qui le contiennent.
    C'est pas du tout strcmp() qu'il faut utiliser, mais strstr().

    EDIT : CORRiGE

    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
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    static void purge(FILE *fp)
    {
       int c;
       while ((c = fgetc(fp)) != '\n' && c != EOF)
       {
       }
    }
     
    static void clean (char *s, FILE *fp)
    {
       /* search ... */
       char *p = strchr (s, '\n'); /* <string.h> */
       if (p != NULL)
       {
          /* ... and kill */
          *p = 0;
       }
       else
       {
          purge (fp);
       }
    }
     
    static int trouver(char *qui)
    {
       int ret = EXIT_SUCCESS;
    #define F "corbeau.txt"
     
       FILE *fp = fopen(F, "r");
       if (fp != NULL)
       {
          int n = 0;
          char ligne[512];
          while (fgets(ligne, sizeof ligne, fp) != NULL)
          {
             clean (ligne, fp);
             char *p = ligne;
     
             while ((p = strstr(p, qui)) != NULL)
             {
                printf("%s\n", ligne);
                n++;
                p++;
             }
          }
          printf("\n%d word%s '%s' found\n\n", n, n > 1 ? "s" : "", qui);
       }
       else
       {
          perror(F);
          ret = EXIT_FAILURE;
       }
       return ret;
    }
     
     
    int main()
    {
       return trouver("Renard");
    }
    avec
    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
     
    Maître Corbeau, sur un arbre perché,
    Tenait en son bec un fromage.
    Maître Renard, par l'odeur alléché,
    Lui tint à peu près ce langage :
    "Hé ! bonjour, Monsieur du Corbeau.
    Que vous êtes joli ! que vous me semblez beau !
    Sans mentir, si votre ramage
    Se rapporte à votre plumage,
    Vous êtes le Phénix des hôtes de ces bois."
    A ces mots le Corbeau ne se sent pas de joie ;
    Et pour montrer sa belle voix,
    Il ouvre un large bec, laisse tomber sa proie.
    Le Renard s'en saisit, et dit : "Mon bon Monsieur,
    Apprenez que tout flatteur
    Vit aux dépens de celui qui l'écoute :
    Cette leçon vaut bien un fromage, sans doute. "
    Le Corbeau, honteux et confus,
    Jura, mais un peu tard, qu'on ne l'y prendrait plus.
    donne (OK, la console Windows, c'est la cata...):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Ma¯tre Renard, par l'odeur allÚchÚ,
    Le Renard s'en saisit, et dit : "Mon bon Monsieur,
     
    2 words 'Renard' found
     
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    merci,
    le problème se situe au niveau du fichier que je traîte, car même avec ta fct,
    ligne reste vide.

    merci
    Wer nicht probiert, verliert !!

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par je®ome
    merci,
    le problème se situe au niveau du fichier que je traîte, car même avec ta fct,
    ligne reste vide.

    merci
    Mon code était faux. Essaye le code corrigé.
    Passe ton fichier.
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre actif Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Points : 225
    Points
    225
    Par défaut
    merci pour cette correction,
    mais le problème se situe sur le fichier,
    ligne reste tjs vide
    en fait je viens de m'apercevoir que le debut de chaque ligne, sauf la première contient les caractères " ^@ "
    je pense que l'erreur provient de la.
    jvais tenter de changer ça

    encore merci
    Wer nicht probiert, verliert !!

Discussions similaires

  1. Comparaison d'un UCHAR avec un CHAR avec strcmp
    Par Pierredc dans le forum Bibliothèques, systèmes et outils
    Réponses: 1
    Dernier message: 17/11/2014, 09h23
  2. comparaison avec la fonction STRCMP
    Par kira9744 dans le forum MATLAB
    Réponses: 2
    Dernier message: 19/04/2011, 12h33
  3. probleme de comparaison avec strcmp
    Par wolverine1987 dans le forum Visual C++
    Réponses: 20
    Dernier message: 18/06/2009, 11h48
  4. Problème avec strcmp ...
    Par Mike888 dans le forum C
    Réponses: 3
    Dernier message: 24/12/2005, 14h22
  5. comparaison avec substring
    Par tidan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/01/2005, 17h13

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