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 d'une ligne de caractères


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 9
    Points
    9
    Par défaut Comparaison d'une ligne de caractères
    Bonjour.

    Je me lance à mon tour aussi:

    J'aimerai comparer toute une ligne de caractères dans un fichier avec une chaîne de caractères, et dès qu'il me trouve cette ligne je pourrai ainsi lancer la procédure, ici ça sera un simple printf("ok\n");

    Voici le code source, pour l'instant ça n'a pas l'air de marcher :/ j'aimerai bien savoir d'où vient le problème:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main () {
     
        FILE *in;
        FILE *out;
     
        char qos[] = "        RESULT";
     
        if ( (in = fopen("./abc.txt","r")) == NULL ) {
     
            fprintf(stderr,"Erreur ouverture fichier de départ\n");
            exit(EXIT_FAILURE);
        }
     
        if ( (out = fopen("./result.txt","w")) == NULL ) {
     
            fprintf(stderr,"Erreur ouverture fichier d'arrivée\n");
            exit(EXIT_FAILURE);
        }
     
     
     
        char ch[100];
     
        while ( (fgets(ch, 100, in) ) != NULL )  {
     
            if ( strcmp(ch,qos) == 0 ) printf("ok\n");
     
        }
     
        return 0;
     
    }

    Pour plus de précisions, n'hésitez pas
    Merci d'avance.

  2. #2
    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 zennn
    J'aimerai comparer toute une ligne de caractères dans un fichier avec une chaîne de caractères, et dès qu'il me trouve cette ligne je pourrai ainsi lancer la procédure, ici ça sera un simple printf("ok\n");

    Voici le code source, pour l'instant ça n'a pas l'air de marcher :/ j'aimerai bien savoir d'où vient le problème:
    Est-tu bien conscient que ligne lue avec fgets() comporte un '\n' à la fin (quand elle est lue complètement).

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Est-tu bien conscient que ligne lue avec fgets() comporte un '\n' à la fin (quand elle est lue complètement).

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    Bonjour.

    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char qos[] = "        RESULT\n";
    mais ça ne marche toujours pas.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'abord, bien que C99 autorise le fait de définir des variables après des instructions et en dehors d'un bloc, ce n'est pas forcément très recommandé, vu que c'est incompatible avec C89/90 et que tous les compilos ne supportent pas C99.

    Maintenant, une chaine ne se définit pas comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        char qos[] = {'R','E','S','U','L','T','\0'};
    mais comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        char *qos = "RESULT";
    généralement....

    Ensuite, plutôt que d emodifier une chaîne de comparaison en lui ajoutant '\n', c'est la chaine lue à laquelle il faut retirer '\n'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       if ( ch[strlen(ch)-1] == '\n' )
           ch[strlen(ch)-1] = '\0' ;
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 25
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par souviron34
    d'abord, bien que C99 autorise le fait de définir des variables après des instructions et en dehors d'un bloc, ce n'est pas forcément très recommandé, vu que c'est incompatible avec C89/90 et que tous les compilos ne supportent pas C99.

    Maintenant, une chaine ne se définit pas comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        char qos[] = {'R','E','S','U','L','T','\0'};
    mais comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        char *qos = "RESULT";
    généralement....

    Ensuite, plutôt que d emodifier une chaîne de comparaison en lui ajoutant '\n', c'est la chaine lue à laquelle il faut retirer '\n'.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       if ( ch[strlen(ch)-1] == '\n' )
           ch[strlen(ch)-1] = '\0' ;

    Merci pour ton aide, voilà le nouveau code source:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
     
    int main () {
     
        FILE *in;
        FILE *out;
     
        char ch[100];
     
        char qos[] = "        RESULT";
     
        if ( (in = fopen("./abc.txt","r")) == NULL ) {
     
            fprintf(stderr,"Erreur ouverture fichier de départ\n");
            exit(EXIT_FAILURE);
        }
     
        if ( (out = fopen("./result.txt","w")) == NULL ) {
     
            fprintf(stderr,"Erreur ouverture fichier d'arrivée\n");
            exit(EXIT_FAILURE);
        }
     
     
        while ( (fgets(ch, 100, in) ) != NULL )  {
     
            if( ch[strlen(ch)-1] == '\n')
                ch[strlen(ch)-1] = '\0';
     
            if ( strcmp(ch,qos) == 0 ) printf("ok\n");
     
        }
     
        return 0;
     
    }
    Donc si j'ai bien compris je remplace le dernier caractère reçu dans ch par '\0', ainsi je pourrais le comparer à char *qos.

    Logiquement ça doit marcher maintenant puisque les deux chaînes sont égaux caractère par caractère. Mais je l'ai essayer ça ne marche toujours pas.
    Quelqu'un peut-il l'essayer pour voir ce qu'il en est?

    Merci.

    Remarque: j'ai mis des espaces devant RESULT car dans le fichier dans lequel je recherche la ligne où il y a RESULT contient des espaces au début. Cependant je chercher aussi à ce que ça soit appliqué pour des lignes ayant plusieurs mot, c à d des espaces entre caractères.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'abord pourquoi ne mets-tu pas fprintf (stderr ..) au lieu de printf ??

    Il n'est pas sûr que ton print s'exécute (pour rappel print n'est PAS SYNCHRONE, alors que fprintf(stderr, ..) l'est..)

    Ensuite, si tu veux savoir si la chaîne CONTIENT la chaîne de comparaison, alors c'est la fonction strstr qu'il faut utiliser.....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if ( strstr( ch, "RESULT" ) != NULL )
        fprintf ( stderr, "\nTROUVE...\n");
    Et dans ce cas enlève les espaces dans la chaîne de comparaison...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    Un moyen de voir "à la main" si 2 chaines de caractères sont égales (je ne m'en sers que pour des tests unitaires, sinon quand la taille des chaines de caractères grandit ça devient laborieux), c'est de faire une comparaison caractère par caractère en hexadécimal
    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
    #include <stdio.h>
    #include <string.h>
     
    int main(void)
    {
            char s1[] = "bonjour";
            char s2[] = "monde";
            int i;
     
            for(i = 0; i < strlen(s1); i++)
            {
                    fprintf(stderr, "%02x ", s1[i]);
            }
            fprintf(stderr, "\n");
     
            for(i = 0; i < strlen(s2); i++)
            {
                    fprintf(stderr, "%02x ", s2[i]);
            }
            fprintf(stderr, "\n");
     
            return 0;
    }
    Affiche
    alex@megabomb:~$ ./test
    62 6f 6e 6a 6f 75 72
    6d 6f 6e 64 65
    On voit bien que les caractères ont des valeurs différentes, ce que printf ne met pas toujours en évidence

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par muad'dib
    Un moyen de voir "à la main" si 2 chaines de caractères sont égales (je ne m'en sers que pour des tests unitaires, sinon quand la taille des chaines de caractères grandit ça devient laborieux), c'est de faire une comparaison caractère par caractère en hexadécimal
    bah inutilement compliqué non ??? strcmp ou ststr font très bien le boulot....
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    En fait cette technique sert surtout à localiser les différences entre les chaines.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ok, mais t'as pas besoin de les comparer en binaire.. En valeurs (entières ou char puisqu'en C c'est pareil), ça marche parfaitement...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 011
    Points : 1 375
    Points
    1 375
    Par défaut
    En valeur entière ok, mais en char non, tous les char ne sont pas imprimables sur la console

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

Discussions similaires

  1. [script bash] Rechercher une ligne de caractères dans un fichier
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 09/09/2010, 11h42
  2. Réponses: 3
    Dernier message: 06/01/2010, 17h14
  3. Réponses: 4
    Dernier message: 06/09/2009, 20h08
  4. transformation d'une ligne de caractères
    Par miltone dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 23/03/2009, 21h49
  5. Lire une ligne de caractères et de doubles avec sscanf
    Par colinou dans le forum Débuter
    Réponses: 4
    Dernier message: 16/03/2008, 20h46

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