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 :

évaluation de l'instruction if [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut évaluation de l'instruction if
    Bonjour,

    J'essai de réalisé un petit pgm qui recherche un index (dans un fichier) correspondant à l'argument passé lors de l'exécution du pgm.

    Pour trouver cet index, je compare l'argument avec une portion de string du fichier. Cependant lors de la comparaison par l'instruction if, celui-ci ne fonctionne jamais (pas dégalité trouvé), bien qu'a l'affichage de l'argument et du string il soient identiques.
    j'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (argv[1] == pdeb)
    {
    ----
    }
    /* est egalement */
    if (argv[1] = pdeb)
    {
    ----
    }
    dans le premier cas la condition n'est jamais vrai, dans le second elle est toujours vrai.

    exemple du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    6360144 MZ01MA0 
    29981132 KS01MCO
    38204659 A213MA0
    79362290 OZ01MCO
    exemple d'un argument
    J'avoue ne pas comprendre pourquoi cela ne fonction pas, est'il possible de comparer des chaines string avec l'instruction if ?
    voici mon code
    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
     
    #include <stdio.h>               
    #include <stdlib.h>              
    #include <errno.h>               
    #include <string.h>                         
    int main(int argc, char *argv[]) 
    {            
    int rec = 0;                                    /*compteur de reccord */
    int c = 0;                                                 /*compteur */
    int LenI = 0;                                 /* taille de l'enreg    */
    int LenC = 0;                                 /* taille des parametres*/
    int Len = 0;                                     /* taille de l'index */
    char *pdeb = NULL;                                       /* pointeur  */
    char LPARCPC[20]="";                                /* nom LPAR + CPC */
    char RECINDX[85] = "";                            /* enreg du fichier */
    char INDEX[20] = "";                               /* INDEX de la MIB */
    FILE *findx;                       /* pointeur pour fichier parametre */
    findx = fopen("dd:SYSMIB","r");               /* ouverture du fichier */
    if (findx != NULL)                                  /* test ouverture */
     {                                                                      
      printf(" argv[1]  :%s\n",argv[1]);                                    
      while(fgets(RECINDX,80,findx) != NULL)             /* lit le fichier*/
        {                                                                    
           c = 0;                                      /* init du compteur */
           pdeb = strchr(RECINDX,' ');                 /*recherche LPARCPC */
           char *cn = strchr(pdeb,'\n');                  /*recherche '\n' */
           if ( cn != NULL)                                                  
            {                                                                
             *cn = '\0';                                                     
            }                                                                
           pdeb = pdeb+1;      /* avance d'un carctere pour eviter  espace*/ 
           printf(" LPAR CPC :%s\n",pdeb);                                   
           if (argv[1] == pdeb)                                              
          {                                                                
             printf(" coucou \n ");                                        
             LenI = strlen(RECINDX);                /* taille du reccord */
             LenC = strlen(pdeb);                   /* taille LPARCPC */   
             Len = LenI - LenC;                     /* taille de l'index */
             printf(" rec : %s\n",RECINDX);                                
             for (c=0;c<Len;c++)                                           
               {                                                           
               INDEX[c] = RECINDX[c];         /* constitution de lindex */ 
               }                                                           
             printf("INDEX : %s\n",INDEX);                                 
          } /* fin du if argv[1] */                                        
       }                                                                   
     }                                                                     
     return(0);                                                            
    } /* fin du main*/

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    La comparaison de chaîne de caractères se fait avec la fonction strcmp() et non pas avec "=="

  3. #3
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    C'est vrai que ça marche beaucoup mieux, , j'ai pas encore tout les bon réflexes (choix des bonnes instructions).
    J'ai refais mon if mais sur la valeur retournée par strcmp() est ça marche.

    Merci beaucoup

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Peut-être veux-tu comprendre pourquoi tes deux tentatives renvoyaient vrai ou faux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (argv[1] == pdeb)
    {
    ----
    }
    Dans ce cas, tu compares l'adresse du premier caractère de argv[1] avec l'adresse du premier caractère de pdeb. Dans le cas de ton programme, ces adresses sont bien évidemment différentes (même si le caractère pointé est le même dans les deux cas).
    Ton test renvoie donc faux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (argv[1] = pdeb)
    {
    ----
    }
    Dans ce cas, tu effectues une affectation et non une comparaison. L'opérateur d'affectation a pour particularité de renvoyer la valeur affectée. Tu testes donc si la valeur est différent de 0 ou non. Dans ton cas, puisque pdeb n'est plus nul, le test renvoie vrai.

  5. #5
    Membre éclairé Avatar de SPACHFR
    Profil pro
    Paaaaaa
    Inscrit en
    Février 2004
    Messages
    557
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paaaaaa

    Informations forums :
    Inscription : Février 2004
    Messages : 557
    Par défaut
    merci pour cette precision, car j'allais justement poser la question.
    Je pensais (à tort) que le caractère '=' était un caractère d'affection mais hors instructions d'évaluation type if(---).
    Bref cette précison est utile, du plus j'ai appris encore quelque chose...un petit pas de plus...

    Merci

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

Discussions similaires

  1. Instructions ROL et ROR
    Par bigbang dans le forum Assembleur
    Réponses: 13
    Dernier message: 01/03/2003, 02h06
  2. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44
  3. Instruction pour créer un fichier text ???
    Par Soulsurfer dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h17
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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