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 :

condition avec des pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    dessinateur projeteur VRD
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : dessinateur projeteur VRD
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut condition avec des pointeurs
    bonjour,

    j'aimerais savoir si il est possible de tester un pointeur dans une condition du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    If (*pointeur == "ok" ) {
    }
    else {
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    Tu veux bien tester que la variable pointée par ton pointeur est la chaîne de caractères "ok" ? Si c'est ça, tu ne peux pas. En effet, *pointeur est un char (si pointeur est de type pointeur sur char) et non une chaîne de caractère.

    Si en revanche tu cherches à faire if (pointeur == "ok" ), le comportement est indéterminé d'après gcc. C'est sûrement parce l'adresse à laquelle est stockée la chaîne constante "ok" du test est indéterminée, et qu'il n'y a aucune raison que toutes les chaînes contenant "ok" soient stockées au même endroit.

    Dans le cas 1, il te faut utiliser une fonction de comparaison de chaînes de caractères, comme strcmp dont le prototype est fourni par string.h:
    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>
    #include <string.h>
     
    int main (void)
    {
        char *pointeur="ok";
        if ( strcmp(pointeur, "ok")==0 )
            printf("OK\n");
        else
            printf("NOK\n");
        return 0;
    }

  3. #3
    Membre averti
    Homme Profil pro
    dessinateur projeteur VRD
    Inscrit en
    Mars 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : dessinateur projeteur VRD
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2009
    Messages : 32
    Par défaut
    merci ceci à résolu mon problème
    je suis idiot, j'ai oublié que c'était une chaine de caractère

    J'ai une seconde question

    comment fait-on la même chose avec un switch ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    "La même chose" avec un switch ?
    Impossible.

    Un switch/case ne peut vérifier que des valeurs entières (int, char, ... (unsigned? j'avais lu qu'un switch était limité à 0-255 en case, est-ce toujours vrai ? obsolète ? toujours été faux ?)).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par Bousk Voir le message
    "La même chose" avec un switch ?
    Impossible.

    Un switch/case ne peut vérifier que des valeurs entières (int, char, ... (unsigned? j'avais lu qu'un switch était limité à 0-255 en case, est-ce toujours vrai ? obsolète ? toujours été faux ?)).

    Hello,

    j'ai par curiosité jeté un coup d'oeil au std C11, un compilateur doit au moins être capable de gérer 1023 labels case dans un switch.

  6. #6
    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
    Citation Envoyé par kwariz Voir le message
    Hello,

    j'ai par curiosité jeté un coup d'oeil au std C11, un compilateur doit au moins être capable de gérer 1023 labels case dans un switch.
    C'est aussi le cas en C99

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 494
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 494
    Billets dans le blog
    1
    Par défaut
    J'avais aussi un souvenir de 255 valeurs possibles. J'ai remarqué la norme C99 (edit : grillé par diogene) et comme en C11, le compilateur est censé supporte 1023 labels. On doit avoir des souvenirs faux ou alors du C89

    comment fait-on la même chose avec un switch ?
    Il faut voir le switch comme (presque) une batterie de if où tu compares une valeur à une autre. Tu ne peux pas comparer directement deux tableaux, donc tu peux pas faire un switch avec une chaine de caractères.

    @Bousk : Merci pour l'information, je ne savais pas que ça devait être un entier !

    D'ailleurs, en testant, je me suis aperçu que ce doit être une constante entière, sinon erreur : l'étiquette du « case » ne se réduit pas en une constante entière.

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par LM_programme Voir le message
    comment fait-on la même chose avec un switch ?
    ça dépend de ce que tu entends par "la même chose".

    Utiliser des chaînes, tu peux en les comparant caractère par caractère :

    Code C : 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
    switch ( *p )
     {
        case 'd' :
              if ( *(p+1) == 'e' )
                  fprintf ( stderr, "DEBUT");
              else
                  fprintf ( stderr, "%s", p);
              break ;
     
        case 'f' :
             if ( *(p+1) == 'i' )
                  fprintf (stderr, "FIN");
             else
                  fprintf ( stderr, " %s", p);
             break ;
     }

    On pourrait le faire directement avec les caractères :

    Code C : 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
    switch ( Ligne[0] )
     {
        case 'd' :
              if ( Ligne[1] == 'e' )
                  fprintf ( stderr, "DEBUT");
              else
                  fprintf ( stderr, "%s", Ligne);
              break ;
     
        case 'f' :
             if ( Ligne[1] == 'i' )
                  fprintf (stderr, "FIN");
             else
                  fprintf ( stderr, " %s", Ligne);
             break ;
     }

    Faire un switch directement sur une valeur de pointeur est, comme indiqué ci-dessus, normalement impossible..

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    Une autre approche mettant en oeuvre un switch/case pour tester des chaînes de caractères.

    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
    #include <stdio.h>
     
    enum                    { R_OK = 0, R_PAS_OK, R_JE_SAIS_PAS, R_COUT} ;
    char * mesReponses[R_COUT] = {"OK","PAS OK",  "JE SAIS PAS"};
     
    int main(int argc, char* argv[])
    {
     
        char * p2Test = "JE SAIS PAS";
     
        switch(GetStrIndex(p2Test))
        {
            case  R_OK:            printf("OK trouve");          break;
            case  R_PAS_OK:        printf("PAS OK trouve");      break;
            case  R_JE_SAIS_PAS:   printf("JE SAIS PAS trouve"); break;
     
            default:
                printf("ERREUR : inconnu <%s>", p2Test);
                break;
        }
     
        getch();
     
        return 0;
    }
     
    int GetStrIndex(char * pStr)
    {
        int i;
        for (i=0 ; i<R_COUT ; i++)
        {
            if(strcmp(mesReponses[i], pStr) == 0)
                break;
        }
        return i < R_COUT ? i : -1;
    }

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Encore une autre approche si tu as peu de chaînes est d'utiliser une fonction de hachage et de faire un switch sur la valeur obtenue. Plus sérieusement, j'ai lu quelque part (sans doute dans les commentaires de cette même page) qu'il existait des algorithmes permettant de déterminer une fonction de hachage qui ne cause pas de collisions sur un ensemble restreint.

    (voir les liens externes dans le dernier lien posté)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. problème char-actéristique avec des pointeurs
    Par Antigonos Ier Gonatas dans le forum C
    Réponses: 11
    Dernier message: 16/04/2007, 21h22
  2. Réponses: 2
    Dernier message: 21/03/2007, 10h55
  3. Réponses: 8
    Dernier message: 11/03/2007, 18h10
  4. Réponses: 2
    Dernier message: 21/02/2007, 13h28
  5. Probleme avec des pointeurs...
    Par barucca dans le forum C++
    Réponses: 5
    Dernier message: 23/08/2005, 21h05

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