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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    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

  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 éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    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
    Membre éclairé Avatar de Spinoza23
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    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.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    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

  6. #6
    Expert confirmé
    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 : 39
    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
    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.

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

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

  8. #8
    Expert confirmé
    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 : 39
    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
    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.

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    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

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 328
    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...

  11. #11
    Expert confirmé
    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
    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

+ 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