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 :

Problème avec un strcmp


Sujet :

C

  1. #1
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut Problème avec un strcmp
    Bonjour à tous, voilà mon petit souci : J'aimerai lire un fichier, récupérer les informations en les triant... Pour ce qui est de la lecture et de la récupération pas de soucis, mais c'est pour le tri que les choses se compliquent. J'aimerai comparer deux chaines de caractères qui doivent et qui à priori, sont la plus part du temps identiques. Malheureusement, je ne sais pas pourquoi je ne rentre pas dans mon if de condition. Je vous montre le code ça sera certainement plus clair :

    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 motcle[12];/* variable qui va contenir le mot cle de ligne lue */
        char val[18];  /* variable qui va contenir la valeur */
        char * sep;    /* variable qui va contenir le separateur */
        motcle[12]= '\0';
        val[18]= '\0';
        printf("Entree P202 \n");
        /* Recherche du separateur dans la chaine */
        printf("Valeur de ligne>%s<\n", ligne);
        sep = strchr(ligne, '=');
        printf("Valeur de sep>%d<\n", sep);
     
        /* Initialisation des variables avec les valeurs correspondantes */
        /*motcle = strncpy(l_T_cartes[i].Mot_cle, ligne, 11);*/
        /* val    = strcpy (l_T_cartes[i].Valeur, sep +1); */
        strncpy(motcle, ligne, 12);
        printf("Valeur de motcle >%s< \n", motcle);
        strcpy (val, sep +1);
        printf("Valeur de val >%s< \n", val);
     
        /*Test de la ligne et des differentes valeurs*/
     
        /* Verification du mot cle et action en consequences */
        if (strcmp(motcle, "UNIT DSNAME ")== 0)
        {
            printf("Lecture de %s \n", motcle);
            strncpy(l_T_cartes[0].Valeur, val, 6);
            l_T_cartes[0].gere   = 'Y';
            printf("Attribution de Unit : <%s> \n", l_T_cartes[0].Valeur);
            printf("Gestion de UNIT DSNAME : %c \n", l_T_cartes[0].gere);
            return(g_rc);
        }
    Le " if (strcmp(motcle, "UNIT DSNAME ")== 0)" n'est donc pas valable, puisque je n'ai jamais l'affichage du "printf("Lecture de %s \n", motcle);"... Es ce que quelqu'un aurait une idée pour m'aider ou alors une erreur que je n'ai pas vu.

    D'avance merci de votre aide
    Java c'est pas de la menthe a l'eau
    Et n'oubliez pas : Ne pas respirer tue...
    Mon BLOOOUUUG Un site trop bien

    Pour la recherche JAVA des liens pratiques :
    GOOGLE LA JAVADOC LES FAQ LES ARCHIVES

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Il y a un soucis dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (strcmp(motcle, "UNIT DSNAME ")== 0)
    Quand tu écris "UNIT DSNAME ", il faut penser "UNIT DSNAME \0" : de taille 13 ! Comme motcle n'est que de taille 12, il y a peu de chance que ta comparaison aboutisse.

    Solution, passer à strncmp(..., ..., 12) ou retirer le dernier espace...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Un petite remarque à confirmer,
    la variable motcle est un tableau de 12 caractère
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char motcle[12];/* variable qui va contenir le mot cle de ligne lue */
    Mais tu fais:
    Et donc, tu mets le 13ème caractère à '\0', pour moi tu es en dehors du tableau

    Sinon, la taille de motcle est de 12 mais celle de "UNIT DSNAME " 13, c'est donc normal que tu ne passes jamais le if. Utilise strncmp sur les 12 premiers caractères.

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        char motcle[12];/* variable qui va contenir le mot cle de ligne lue */
        char val[18];  /* variable qui va contenir la valeur */
    ...
        motcle[12]= '\0';
        val[18]= '\0';
    Ces valeurs sont hors des tableaux (indices 0 à 11 et 0 à 17)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        sep = strchr(ligne, '=');
    ...
        strncpy(motcle, ligne, 12);
    ...
        strcpy (val, sep +1);
    J'en déduis que motcle est en début de ligne et est suivi d'une suite de caractères. Par conséquent, le comportement de strncpy fait que la chaîne motcle ne sera pas terminée par un zéro terminal. (Il faut mettre celui-ci explicitement si la chaîne source est plus grande ou égale que le nombre de caractères demandés). Ceci fera échouer la comparaison
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  5. #5
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Je vien juste d'y penser... Merci beaucoup... J'hésitait entre rajouter \0 dans ma chaine de comparaison, mais je n'avais pas pensé à strncmp... j'essaye et je vous dit.
    Java c'est pas de la menthe a l'eau
    Et n'oubliez pas : Ne pas respirer tue...
    Mon BLOOOUUUG Un site trop bien

    Pour la recherche JAVA des liens pratiques :
    GOOGLE LA JAVADOC LES FAQ LES ARCHIVES

  6. #6
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Oui tout à fait, motcle est en début de ligne... le fichier se présente de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    UNIT DSNAME =SYSDA
    VOLUME1     =ETD000
    TYPE ALLOC  =TRK
    DISQ PRIMAI =00000030
    DISQ SECOND =00000030
    LRECL       =08205
    DCB BLKSIZE =00000
    BUFNO       =003
    PREFIX      =TRAV.S028443.
    NOM PROCMEF =IYCAJMF
    NOM PROCRAN =IYCAJRN
    TIMESTAMP   =O
    Java c'est pas de la menthe a l'eau
    Et n'oubliez pas : Ne pas respirer tue...
    Mon BLOOOUUUG Un site trop bien

    Pour la recherche JAVA des liens pratiques :
    GOOGLE LA JAVADOC LES FAQ LES ARCHIVES

  7. #7
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par frenchi
    Et donc, tu mets le 13ème caractère à '\0'
    Sauf qu'il n'y a pas de 13ème caractère puisque la taille de motcle est 12. La solution ce n'est pas d'utiliser strncmp à la place de strcmp, c'est de donner la taille adéquate à chaque tableau.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    à Melem, oui c'est pour cela que j'ai rajouté qu'il était en dehors du tableau

  9. #9
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Spinoza23, Vu la structure de ton fichier, tu ferais mieux de lire une ligne avec fgets (bien sûr) puis séparer les "composantes" à l'aide de strtok. Comme ça, tu n'auras même plus besoin d'uniformiser la taille de tes mot-clés.

  10. #10
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par Melem Voir le message
    Spinoza23, Vu la structure de ton fichier, tu ferais mieux de lire une ligne avec fgets (bien sûr)
    C'est bien comme cela que je procède, je te rassure.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_ligne = fgets(buf_ligne, sizeof(buf_ligne), g_fp);
    Pour le reste je vais tout de même tenter un strncmp... Il me parrait plus approprié... Mais si ça ne marche pas, j'essaye autre chose... :p
    Java c'est pas de la menthe a l'eau
    Et n'oubliez pas : Ne pas respirer tue...
    Mon BLOOOUUUG Un site trop bien

    Pour la recherche JAVA des liens pratiques :
    GOOGLE LA JAVADOC LES FAQ LES ARCHIVES

  11. #11
    Membre habitué Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    Points : 166
    Points
    166
    Par défaut
    Ci cool !!! Problème résolut donc avec le strncmp... ça ç suffit pour résoudre le problème. Merci de votre aide...
    Java c'est pas de la menthe a l'eau
    Et n'oubliez pas : Ne pas respirer tue...
    Mon BLOOOUUUG Un site trop bien

    Pour la recherche JAVA des liens pratiques :
    GOOGLE LA JAVADOC LES FAQ LES ARCHIVES

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

Discussions similaires

  1. Problème avec la fonction STRCMP()
    Par Sasuke59 dans le forum Débuter
    Réponses: 2
    Dernier message: 19/01/2010, 18h00
  2. petit problème avec strcmp
    Par BnY dans le forum C
    Réponses: 74
    Dernier message: 20/04/2006, 09h07
  3. Problème avec strcmp ...
    Par Mike888 dans le forum C
    Réponses: 3
    Dernier message: 24/12/2005, 14h22
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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