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 d'égalité en C


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 35
    Points : 28
    Points
    28
    Par défaut Problème d'égalité en C
    Bonjour,

    Je rencontre un problème lorsque je réalise un test d'égalité.
    Le principe : j'appelle mon programme dans une fenêtre de commande et je lui passe des paramètres, de la façon suivante :
    test2.e param1 1111222233334444
    J'ai aussi testé de la façon suivante :
    test2.e "param1" "1111222233334444"

    La fonction main est censée agir en fonction du test d'égalité.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include <stdio.h>
    int main( int argc, char** argv )
    {  if(argv[2] == "1111222233334444")
      {
       printf("C ok \n");
      }
      else
      {
       printf(argv[2]);
       printf("\n C ko \n");
      }
    }

    voici l'affichage qui en résulte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1111222233334444
     C ko
    Hors selon mes attentes il devrait me mettre ok puisque les données sont identiques, voyez vous le problème ?
    Je vous remercie d'avance pour vos réponses.

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

    Pour tester l'égalité de deux chaines de caractères, il ne faut pas utiliser == mais strcmp.

  3. #3
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    • En C les fichiers sources portent l'extension *.c et non *.e
    • main retourne un int
    • La comparaison des chaînes ne se fait pas avec l'opérateur ==
    • Il faut vérifier l'existence des paramètres attendues

    Correction :
    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
     
    #include <stdio.h>
    #include <string.h>
     
    int main( int argc, char** argv )
    {
    	if( argc>=2 )
    	{
    		if( strcmp(argv[2],"1111222233334444")==0 )
    		{
    			printf("C ok \n");
    		}
    		else
    		{
    			printf("%s\n",argv[2]);
    			printf("C ko \n");
    		}
    	}
    	return 0;
    }
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  4. #4
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci pour vos réponses.

    ssmario2 dit :
    En C les fichiers sources portent l'extension *.c et non *.e
    main retourne un int
    La comparaison des chaînes ne se fait pas avec l'opérateur ==
    Il faut vérifier l'existence des paramètres attendues
    1) Pour ce qui est de l'extension, en fait je vous ai mis la manière dont j'appelle mon programme une fois compilé, donc effectivement j'appelle le .e, mais le code faire référence au .c
    2) Pour ce qui est de la comparaison en fait il s'agit plus d'un int à la base mais quand je compilais avec le bout de code suivant dans main
    if( argv[2] == 1111222233334444 )
    Il me faisait une erreur de compilation :

    test2.c: In function 'main':
    test2.c:48: warning: integer constant is too large for 'long' type
    test2.c:48: warning: comparison between pointer and integer
    J'ai cru comprendre que cela venait du type mais je n'ai pas vu de type qui pourrait convenir pour ce type de nombre (trop long).

    Si vous avez une idée sur la question ?

    Sinon tant pis, étant donné que le code fonctionne je vous remercie tout les deux, mabu pour l'orientation, et ssmario2 pour le détail.

    Bonne journée.

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par supertotal Voir le message
    Il me faisait une erreur de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    test2.c: In function 'main':
    test2.c:48: warning: integer constant is too large for 'long' type
    test2.c:48: warning: comparison between pointer and integer
    Que dit le compilateur ?
    Citation Envoyé par google
    test2.c: 48: avertissement: integer constante est trop grande pour long "type
    Veut dire que 1111222233334444 est trop grand pour tenir dans un seul entier. En effet, les entiers signés sont limités en gros à +/- 4 milliards (sur processeur 32 bits)
    Voir INT_MAX et INT_MIN dans <limits.h>

    Pour travailller avec des nombres plus grand, on passe par le type long long.

    Deuxième warning
    Citation Envoyé par google
    test2.c: 48: avertissement: comparaison entre le pointeur et entier
    On compare argv[2] qui est un pointeur sur chaine de caractère et un entier... ça ne peut pas fonctionner.

    Pour convertir chaine en entier, on peut utiliser strtol ou strtoll si on travaille avec des long long.

  6. #6
    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 mabu Voir le message
    Que dit le compilateur ? Veut dire que 1111222233334444 est trop grand pour tenir dans un seul entier. En effet, les entiers signés sont limités en gros à +/- 4 milliards (sur processeur 32 bits)
    Hum... 2^31 = 2147483648 La plage garantie d'un long est donc :

    -2147483647 .. +2147483647
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Hum... 2^31 = 2147483648 La plage garantie d'un long est donc :

    -2147483647 .. +2147483647
    Je pensais 4 milliards de valeurs... mea culpa.

Discussions similaires

  1. [XL-2003] Problème d'égalité de variables ?
    Par lucasflorent dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/04/2014, 11h06
  2. Problème d'égalité "String"
    Par Misaki43 dans le forum Spring
    Réponses: 2
    Dernier message: 03/04/2013, 08h15
  3. problème d'égalité
    Par amne_siac dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/11/2008, 17h08
  4. Problème d'égalité de valeurs
    Par The Ultimate Gibbon dans le forum Fortran
    Réponses: 1
    Dernier message: 23/04/2008, 19h09
  5. Problème d'égalité dans fonction
    Par LKnight dans le forum MATLAB
    Réponses: 19
    Dernier message: 12/12/2007, 10h25

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