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 :

Instruction switch case


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Par défaut Instruction switch case
    Bonjour à tous,
    Lors de l'utilisation d'une instruction conditionnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    switch (variable)
    {
    expression 1:
    break;
    expression2:
    break;
    .
    .
    .
    etc
    }
    Quel doit etre le type de variable?
    Si variable est une chaine de caractere, comment ecrire les expression?

    merci beaucoup d'avance.

  2. #2
    Membre éprouvé Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Par défaut
    Salut,

    Bon, je suis pas un pro mais pour le type de variable, tu peux mettre des nombres ou des caractères. Pour les chaînes de caractères, tu peux le faire à l'aide d'un enum.

    A+,

    Hunta

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Par défaut
    ok mais il n'y a pas d'autre solution pour les chaines de caractere,pcq j'ai un nombre de choix tres important?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par défaut
    En C, variable doit être de type "int" et les expressions sont des constantes.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch (variable) {
        case 1: ....; break;
        case -2: ....; break;
        default: ...;
    }
    On peut aussi utiliser un type char (qui est une sorte de "int") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    switch (ch) {
        case 'a' : ....; break;
        case 'b' : ....; break;
        default: ...;
    }
    Pour les chaines de caractères, on est condamné à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (strcmp(a tester, valeur1))
    ...
    else if (strcmp(a tester, valeur2))
    ...
    else if (strcmp(a tester, valeur3))
    ...
    Mais rien n'empêche de "tokeniser" valeur1, ... valeurN: associer le contenu à une valeur entière et mettre le tout dans un conteneur. La fonction de recherche retourne l'entier correspondant.
    Note: En C++, la STL permet de faire cela facilement avec le conteneur std::map.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éprouvé Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Par défaut
    Re,

    Je te propose un lien qui vient de la FAQ : http://cpp.developpez.com/faq/cpp/?p...GS_switch_case

    J'espère que cela correspond à tes attentes.

    A+,

    Hunta

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Par défaut
    ok merci bcp je vais voir ce que je peu faire avec tous cela

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Pour les chaines de caractères, on est condamné à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (strcmp(a tester, valeur1))
    ...
    else if (strcmp(a tester, valeur2))
    ...
    else if (strcmp(a tester, valeur3))
    ...
    Tu veux sans doute dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (strcmp(a tester, valeur1) == 0)
    ...
    else if (strcmp(a tester, valeur2) == 0)
    ...
    else if (strcmp(a tester, valeur3) == 0)
    ...
    on peut aussi utiliser un tableau trié, bsearch(), un index (position), un switch-case sur l'index...

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par défaut
    Oops je voulais dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (! strcmp(a tester, valeur1))
    ...
    else if (! strcmp(a tester, valeur2))
    ...
    else if (! strcmp(a tester, valeur3))
    Mais parfois mes doigts ont des difficultés a suivre mes pensées.
    Merci pour la correction, pour une initiation, votre écriture est préférable.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    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 wiztricks Voir le message
    Oops je voulais dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (! strcmp(a tester, valeur1))
    ...
    else if (! strcmp(a tester, valeur2))
    ...
    else if (! strcmp(a tester, valeur3))
    Mais parfois mes doigts ont des difficultés a suivre mes pensées.
    Merci pour la correction, pour une initiation, votre écriture est préférable.
    - W


    mauvaise écriture

    c'est pourtant simple.. La fonction strcmp n'est pas un booléen, c'est un entier...

    Pourquoi faire de l'abus de langage ???

    Ce qu'a dit Emmanuel est parfaitement correct...

    suppose que var est un booléen.

    Même si le résultat est le même, conceptuellement il est idiot de mélanger les notions de booléen et d'entier, d'autant plus que dans ce cas cela marche pour un seul cas..

    Par contre, on pourrait aussi pour des chaînes vouloir faire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch (a_tester[0]) {
        case 'a' : 
                switch (a_tester[1])
                 {
                    case 'g' : .... ; break ;
                    case 'u' :.... break ;
                    default : break ;
                 }
                break;
        case 'b' : ....; break;
        default: ...;
    }

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par défaut
    En C les booléens sont une extension des entiers: une expression utilisée dans les tests "if (expr)", "while (expr)" est vraie lorsque différente de 0 et fausse lorsqu'égal à 0.

    Il est donc tout à fait licite d'écrire "! strcmp(...)" même si strcmp retourne un int et non un booleen.

    Reste le "style", si nous comparons:
    • if (!strcmp(...))
    • if (strcmp(...) == 0)
    • if (strcmp(...) == TRUE)

    La 3ème est beaucoup plus "lisible".

    Mais j'avais déjà mentionné que mon choix initial n'était pas des plus heureux.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    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 wiztricks Voir le message
    La 3ème est beaucoup plus "lisible".
    mais fausse...

    Et à double titre...

    n'est en général pas la définition ordinaire, et est en contradiction avec


    Mais comme en plus cette définition est possible, encore une raison de plus pour tester par rapport à la valeur de retour DE LA FONCTION telle que mentionnée...


    PS : même chose pour les pointeurs, les file desciptors, les retours de getc, etc etc etc...

    La documentation des fonctions fournit une valeur. S'en servir lors des tests est LA bonne manière de faire...

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    En C les booléens sont une extension des entiers:
    Rien de tel en C90...
    une expression utilisée dans les tests "if (expr)", "while (expr)" est vraie lorsque différente de 0 et fausse lorsqu'égal à 0.
    Oui, quel rapport avec un booléen qui vaut exclusivement 0 ou 1 ?
    Il est donc tout à fait licite d'écrire "! strcmp(...)" même si strcmp retourne un int et non un booleen.
    On a pas dit que c'était illicite, mais plutôt inapproprié. Relis la doc de strcmp(), et verras que la valeur retournée est loin de valoir uniquement 0 ou 1. Ce n'est donc certainement pas un 'booléen'.

    Reste le "style", si nous comparons:
    • if (!strcmp(...))
    • if (strcmp(...) == 0)
    • if (strcmp(...) == TRUE)

    La 3ème est beaucoup plus "lisible".
    3 est carrément faux (ce serait FALSE en admettant que FALSE existe et vaille 0, ce qui n'est pas gagné...)

    A l'évidence, la seule façon de coder correctement un strcmp() est la #2, car c'est celle qui colle exactement à la définition de la fonction.

  13. #13
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 772
    Par défaut
    J'étais sur que ma définition de TRUE allait vous faire réagir.
    J'en avais meme ajouté une couche en écrivant:

    La 3ème est beaucoup plus "lisible".
    Vous proclamez:

    La documentation des fonctions fournit une valeur. S'en servir lors des tests est LA bonne manière de faire..
    Mais ce n'est qu'un "style" que VOUS préférez à d'autres.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    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 wiztricks Voir le message
    Mais ce n'est qu'un "style" que VOUS préférez à d'autres.
    NON

    Voir le post d'Emmanuel..

    Qui plus est, nous sommes dans le sous-forum "Débutez".

    La moindre des choses quand on répond est de répondre par les bonnes pratiques...

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Qui plus est, nous sommes dans le sous-forum "Débutez".

    La moindre des choses quand on répond est de répondre par les bonnes pratiques...
    Donc, pour les bonnes pratiques, il est conseillé d'utiliser strncmp plutôt que strcmp (http://fr.wikipedia.org/wiki/D%C3%A9passement_de_tampon)

  16. #16
    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
    bof....

    tout dépend de ce avec quoi tu compares..

    Si tu fais une comparaison avec une chaine litterale, strcmp est parfait.

    Et pour ce qui est des buffers overflow, faut savoir programmer, aussi...

    Dans toute ma carrière, je n'ai utilisé strncmp que en cas de sous-chaine définie.. du style de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if  ( strncmp ( chaine, "Ceci est le debut", 17) == 0 )
    Mais si c'est pour connaître la valeur d'une chaîne complète, je ne vois pas pourquoi l'utiliser.. Si les chaînes dynamiques sont correctement remplies et initialisées, il n'y a aucun problème..

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Donc, pour les bonnes pratiques, il est conseillé d'utiliser strncmp plutôt que strcmp (http://fr.wikipedia.org/wiki/D%C3%A9passement_de_tampon)
    Je ne vois pas pourquoi... Tant que les chaines sont bien formées, il n'y a aucun risque.

    Sinon, strncmp() est utile dans certains cas bien spécifiques. Tout dépend du contexte et de l'usage...

    Dans l'article que tu cites et que tu n'as pas lu, il est quedstion de strncpy() et non de trncmp()...

    D'ailleurs strncpy() n'est pas le remède à tous les maux et peut entrainer d'autres bugs... Une bonne solution pour gérer les problèmes de débordement de chaine est l'usage intelligent (réfléchi) de strncat()...

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

Discussions similaires

  1. instruction pour boucle switch case
    Par aymench1985 dans le forum MATLAB
    Réponses: 3
    Dernier message: 08/03/2015, 23h46
  2. L'instruction switch case
    Par chek0v dans le forum Général Java
    Réponses: 5
    Dernier message: 03/05/2012, 20h50
  3. switch case : instruction commune à tous les cas ?
    Par contremaitre dans le forum Débuter
    Réponses: 2
    Dernier message: 30/09/2008, 12h09
  4. Instruction switch : regrouper les cases ?
    Par Dendrite dans le forum Langage
    Réponses: 2
    Dernier message: 14/08/2008, 11h41
  5. [Language] aide sur les switch case
    Par pouss dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2005, 11h34

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