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 ou if?


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Instruction switch ou if?
    Bonsoir,

    Est-il possible de faire appel à l'instruction switch pour simplifier ce bout de 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
    char msg[nBytes];
        gets(msg);
     
        if(msg[0] == '2' || msg[1] == '5' || msg[2] == '0') {
            printf("ok 250\n");
            exit(0);
        }
        if(msg[0] == '2' || msg[1] == '6' || msg[2] == '0') {
            printf("ok 260\n");
            exit(0);
        }
        if(msg[0] == '2' || msg[1] == '7' || msg[2] == '0') {
            printf("ok 270\n");
            exit(0);
        }
        else
        printf("you're an idiot :(\n");
    Lorsque l'expression à évaluer n'est qu'une simple variable de type int ou char, je n'ai aucun soucis avec switch. Mais pour tester n éléments dans une chaine, je ne sais pas du tout comment faire...

    Merci d'avance.

  2. #2
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par TheDo Voir le message
    Bonsoir,

    Est-il possible de faire appel à l'instruction switch pour simplifier ce bout de 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
    char msg[nBytes];
        gets(msg);
     
        if(msg[0] == '2' || msg[1] == '5' || msg[2] == '0') {
            printf("ok 250\n");
            exit(0);
        }
        if(msg[0] == '2' || msg[1] == '6' || msg[2] == '0') {
            printf("ok 260\n");
            exit(0);
        }
        if(msg[0] == '2' || msg[1] == '7' || msg[2] == '0') {
            printf("ok 270\n");
            exit(0);
        }
        else
        printf("you're an idiot :(\n");
    Lorsque l'expression à évaluer n'est qu'une simple variable de type int ou char, je n'ai aucun soucis avec switch. Mais pour tester n éléments dans une chaine, je ne sais pas du tout comment faire...

    Merci d'avance.
    Non, on ne peut pas tester de multiple valeur ou des chaînes de caractères avec d'un switch.

    Au passage, es-tu certain du code que tu as écris ? Ne voulais-tu pas plutôt écrire if(msg[0] == '2' && msg[1] == '5' && msg[2] == '0'), de même pour les autres tests ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Points : 593
    Points
    593
    Par défaut
    Si c'est des && doit y avoir moyen de moyenner avec des cast. (Mettre les trois valeurs dans un unsigned int par exemple.)
    Ou sinon tu testes une seule fois si msg[0] == '2' et si msg[2] =='0' et si oui, tu fait un switch pour msg[1].


    PS : gets c'est Mal, utilises fgets.

  4. #4
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Ubiquité Voir le message
    Si c'est des && doit y avoir moyen de moyenner avec des cast. (Mettre les trois valeurs dans un unsigned int par exemple.)
    Effectivement, si c'est bien des && et que ces trois valeurs sont numériques, il est possible de convertir ce bout de chaîne en entier (mais certainement pas avec un cast, plutôt avec strtol et assimilées) et d'utiliser un switch sur l'entier obtenu.

  5. #5
    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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    Peut être un truc plus simple à lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if(memcmp(msg, "250", 3) == 0) {
            printf("ok 250\n");
            exit(0);
        }
    // et pareil pour les autres
    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
    .

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par gl Voir le message
    Effectivement, si c'est bien des && et que ces trois valeurs sont numériques, il est possible de convertir ce bout de chaîne en entier (mais certainement pas avec un cast, plutôt avec strtol et assimilées) et d'utiliser un switch sur l'entier obtenu.
    Flûte ! Oui il s'agit bien de l'opérateur logique and &&. Je cherche à récupérer les trois premiers éléments d'une chaine renvoyé par un serveur : ces entiers correspondent à des codes retours. Comme ils sont plutôt légion, il me semble judicieux d'écrire une seule fonction à l'aide de switch pour traiter l'ensemble de ces codes et exécuter les instructions correspondantes.

    La fonction strtol (String To long?), cette fonction existe t-elle déjà dans un fichier.h? memcmp? Je connaissais pas non plus, je débute...

    Il y a déjà tellement de fonction existante que je ne sais même plus ou regarder.

    Merci à vous pour la rapidité de vos réponses.

  7. #7
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Pour strtol , il faut inclure <stdlib.h> et pour memcmp <string.h>
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Points : 593
    Points
    593
    Par défaut
    Citation Envoyé par gl Voir le message
    il est possible de convertir ce bout de chaîne en entier (mais certainement pas avec un cast, plutôt avec strtol et assimilées)
    Ce que je voulais dire c'est que tu compares les entiers correspondant aux caractères, sans convertir les chaines en entier comme le ferai sscanf. Comparer plutôt les valeurs ascii en fait.

    Par exemple :
    entier = msg[0]*0xFFFF + msg[1]*0xFF + msg[0]

    Ce que fait surement mieux la fonction memcmp.

  9. #9
    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 : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Ubiquité Voir le message
    Par exemple :
    entier = msg[0]*0xFFFF + msg[1]*0xFF + msg[0]
    Oui, c'est également une manière de convertir en entier (enfin en multiplant par 0x10000 et 0x100).
    Par contre il faut aussi faire le calcul pour les résultat possible, ce qui reste d'être plus verbeux et/ou moins lisible que la comparaison avec la valeur attendue (ie 260, etc.).

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Points : 593
    Points
    593
    Par défaut
    C'est vrai que convertir une fois avec strtol puis créer un case pour chaque valeurs possible ça doit être la façon la plus simple et efficace.
    Sachant que de toutes façon il faudra surement faire la conversion à un moment donné ^^.

  11. #11
    Expert éminent sénior

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    oui, il peut y avoir 2 méthodes :

    convertir, ou bien :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    char msg[nBytes];
    int OK=0 ;
     
        gets(msg);
     
        if( (msg[0] == '2') && (msg[2] == '0') )
          {
              switch ( msg[1] )
               {
                  case '5' :
                        OK=250;
                        break ;
                  case '6' :
                        OK=260;
                        break ;
                  case '7' :
                        OK=270;
                        break ;
                  default :
                        break ;
               }
        }
        if ( ! OK )
           printf("you're an idiot :(\n");
       else
          {
              printf ( "ok %d\n", OK);
              exit(0);
          }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    L'ennui avec strtol est de ne faire convertir que les trois premiers caractères (notamment si le quatrième peut être aussi parfois numérique).

    On peut envisager quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     int val = 1000;
     if(isdigit(msg[0]) && isdigit(msg[1])&& isdigit(msg[2])) 
       val = (msg[0]-'0') *100+ (msg[1]-'0')*10+(msg[2]-'0') ;
     switch(val)
     {
        case 250 : ....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  13. #13
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Voici le bout code modifié en faisant appel à strtol :

    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
     
        char msg[512];
        char *ptr = '\0';
        gets(msg);
     
     
        long iTest = strtol(msg, &ptr, 10);
     
        switch(iTest) {
     
        case 250:
        printf("250 ok\n");
        break;
     
        case 260:
        printf("260 ok\n");
        break;
     
        case 4500:
        printf("4500 ok\n");
        break;
     
        case 68000:
        printf("68000 ok\n");
        break;
     
        default:
        printf("unknow\n");
        }
     
        printf("Func ok\n");
    Cela fonctionne. Je vais quand même étudier les autres méthodes proposés, mieux vaut avoir une panoplie de solution à portée de main.

    Encore merci de votre aide

    hs:

    Citation Envoyé par Ubiquité Voir le message
    PS : gets c'est Mal, utilises fgets.
    Gets ne gère pas les débordements de tampon, je sais ce qu'implique une telle faille. Ici, je l'ai seulement utilisé pour illustrer l'exemple.

    C'est une bonne chose de le rappeler.

Discussions similaires

  1. instruction switch
    Par calitom dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/11/2007, 15h50
  2. Petit doute sur l'instruction "switch"
    Par SybVicious dans le forum Débuter
    Réponses: 6
    Dernier message: 28/08/2007, 10h57
  3. Probleme instruction switch
    Par mpascolo dans le forum Langage
    Réponses: 7
    Dernier message: 17/10/2006, 11h14
  4. instruction switch
    Par artatum dans le forum C
    Réponses: 5
    Dernier message: 28/09/2005, 17h20
  5. [Info] Instruction switch
    Par HNT dans le forum Langage
    Réponses: 6
    Dernier message: 23/09/2005, 16h47

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