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 :

Comportement de strcmp


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 23
    Par défaut Comportement de strcmp
    Bonjour à tous,

    Je n'arrive pas à comprendre pourquoi ce test est toujours faux... la fonction strcmp n'est elle pas sensé comparer seulement les n (4 dans mon exemple) premiers caractères ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(strcmp("help", "help0", 4) == 0)
    {
                printHelp();
                return;
    }
    Je suis sous Ubuntu et j'utilise gcc 4.4.3

    Merci d'avance pour vos réponses

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Salut

    Il faut utiliser strncmp et non strcmp. Le compilateur génère des warning s'il est bien réglé.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strcmp("help", "help0", 4) == 0)
    Cela n'aurait jamais du passer avec un compilateur bien réglé.

    La page man de strcmp indique clairement que strcmp attend 2 paramètres et pas 3 comme tu l'as fait.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    Ton compilateur ne t'a pas craché tout son venin à la figure? Impressionnant! Sinon la fonction que tu recherche est strncmp().

  5. #5
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(strcmp("help", "help0", 4) == 0)
    Cela n'aurait jamais du passer avec un compilateur bien réglé.
    Si le compilateur fait une déclaration implicite parce qu'on a oublié d'inclure string.h, alors l'erreur peut être masquée (c'est indépendant des réglages du compilateur me semble-t-il).

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par uknow Voir le message
    Si le compilateur fait une déclaration implicite parce qu'on a oublié d'inclure string.h, alors l'erreur peut être masquée (c'est indépendant des réglages du compilateur me semble-t-il).
    Avec les bons réglages, le compilateur émet au moins un warning "unknown function strcmp()"
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Avec les bons réglages, le compilateur émet au moins un warning "unknown function strcmp()"
    Oui, mais on n'obtient ce type d'erreur que si on "inhibe" les déclarations implicites (chose qui ne me semble pas être faisable par utilisation des options de compilation, je me trompe ?!), ou si le compilateur est assez intelligent pour savoir qu'il s'agit de la fonction dont la déclaration est dans string.h que nous n'avons pas inclus.

    GCC retourne un message d'erreur "en bonus" sur une mauvaise utilisation des fonctions standards même sans qu'on ait inclut les "headers" associés, donc le problème est réglé. Mais je suppose que tous les compilateurs ne sont pas pareils à ce niveau.

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par uknow Voir le message
    Oui, mais on n'obtient ce type d'erreur que si on "inhibe" les déclarations implicites (chose qui ne me semble pas être faisable par utilisation des options de compilation, je me trompe ?!), ou si le compilateur est assez intelligent pour savoir qu'il s'agit de la fonction dont la déclaration est dans string.h que nous n'avons pas inclus.
    Non.

    Par exemple, gcc (mais cela est vrai pour d'autre compilateurs) correctement réglé remonte bien un warning du type de celui indiqué par ram-000 sans pour autant inhiber la déclaration implicite (le code compile) même sur des fonctions personnelles :

    C:\data\Workspace\C\DVP\main.c|6|warning: implicit declaration of function 'test'|

  9. #9
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Citation Envoyé par gl Voir le message
    Par exemple, gcc (mais cela est vrai pour d'autre compilateurs) correctement réglé remonte bien un warning du type de celui indiqué par ram-000 sans pour autant inhiber la déclaration implicite (le code compile) même sur des fonctions personnelles :
    Oui on est d'accord, mais il s'agit d'un warning sur une déclaration implicite, et pas sur une mauvaise utilisation d'une fonction, telle que le post suivant laisserait entendre :

    Cela n'aurait jamais du passer avec un compilateur bien réglé.
    (J'interprète mal peut être ?!).

    Ce que je veux souligner est que le seul moyen de remonter une erreur de compilation proprement dite est d'inclure string.h. Chose qui permettrait au compilateur de vérifier la validité des arguments et de retourner une erreur du type : "Too many arguments to function strcmp." ce qui n'a rien à voir avec sa configuration. D'autre part on ne peut pas lui en vouloir s'il ne l'indique pas alors qu'on a oublié de déclarer cette fonction.

  10. #10
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par uknow Voir le message
    Oui on est d'accord, mais il s'agit d'un warning sur une déclaration implicite, et pas sur une mauvaise utilisation d'une fonction, telle que le post suivant laisserait entendre :
    Tout à fait d'accord.

    Citation Envoyé par uknow Voir le message
    Ce que je veux souligner est que le seul moyen de remonter une erreur de compilation proprement dite est d'inclure string.h. Chose qui permettrait au compilateur de vérifier la validité des arguments et de retourner une erreur du type : "Too many arguments to function strcmp."
    Tout à fait d'accord encore

    Ceci dit, derrière chaque warning du compilateur se cache une erreur potentielle et la prudence et l'expérience m'ont appris à ne pas ignorer ces warning et à les traiter comme des erreurts (même si le compilateur a généré un binaire exécutable).

    Et d'ailleurs, dans Visual Studio, il y a une option du compilateur (l'option /WX) qui dit "traiter les warning comme des erreurs'.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  11. #11
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Et d'ailleurs, dans Visual Studio, il y a une option du compilateur (l'option /WX) qui dit "traiter les warning comme des erreurs'.
    Je suis du même avis concernant les "warnings" je les associe même à des bogues potentiels. L'option pour GCC est -werror.

  12. #12
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par uknow Voir le message
    Ce que je veux souligner est que le seul moyen de remonter une erreur de compilation proprement dite est d'inclure string.h. Chose qui permettrait au compilateur de vérifier la validité des arguments et de retourner une erreur du type : "Too many arguments to function strcmp." ce qui n'a rien à voir avec sa configuration. D'autre part on ne peut pas lui en vouloir s'il ne l'indique pas alors qu'on a oublié de déclarer cette fonction.
    Par le warning, le compilateur signale bien le problème (utilisation d'une fonction inconnue, donc pas de vérification de cohérence entre le prototype et l'appel).

    Je comprends ton raisonnement dans le sens où il ne pointe pas explicitement le problème du nombre de paramètres. Toutefois il signale bien qu'il y a un problème.

Discussions similaires

  1. open avec comport
    Par Goldocrack dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/04/2009, 08h12
  2. [Free Pascal] Comportement de Exec
    Par néo333 dans le forum Free Pascal
    Réponses: 3
    Dernier message: 01/11/2003, 17h46
  3. Utilisation de strcmp!
    Par fmv12 dans le forum C
    Réponses: 10
    Dernier message: 30/10/2003, 12h22
  4. Réponses: 2
    Dernier message: 22/09/2003, 11h23
  5. caractère générique utilisable dans strcmp
    Par barthelv dans le forum C
    Réponses: 9
    Dernier message: 01/08/2003, 16h54

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