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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    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

  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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    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 éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    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:

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

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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 ?

  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 : 41
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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.

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