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 :

Switch et chaine de caractere


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut Switch et chaine de caractere
    (Re)Bonjour à toutes et à tous.

    Je viens vers vous car j'ai un problème assez basique en C, mais auquel je ne trouve pas la réponse.

    Cela concerne la boucle de type switch. Quand on a une chaine de caractere dont on souhaite tester la valeur, comment doit-on procéder ?

    Quand j'écrits un truc du genre (avec pszVariable1 prenant comme valeur possible toto, tata, tutu).

    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
     
    char * pszVariable1;
     
    switch(pszVariable1)
    {
             case "toto":
                     traitement1;
             break;
             case "tata" :
                     traitement2;
             break;
             case "tutu":
                     traitement3;
             break;
             default :
                     traitement4;
             break;
    }
    Quand je fais quelque chose de ce genre, j'ai l'erreur suivante qui ma stoppe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "g.c", line 36.30: 1506-051 (E) Case expression must be a valid 
    integral constant.
    Je sais, c'est sûrement une question très bête , mais je ne trouve la réponse ni dans mon bouquin, ni sur les maigres pages du net auxquelles j'ai accès.

    Bahan

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Bahan
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "g.c", line 36.30: 1506-051 (E) Case expression must be a valid 
    integral constant.
    Je sais, c'est sûrement une question très bête , mais je ne trouve la réponse ni dans mon bouquin, ni sur les maigres pages du net auxquelles j'ai accès.
    C'est pourtant clair, la condition du case doit être un entier constant. De plus pour effectuer la comparaison de deux chaînes de caractères, il faut utiliser la fonction strcmp donc tu ais obligé de passer par une série de if.

  3. #3
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Par défaut
    D'accord, je pensais qu'il y avait peut-être un autre moyen, mais je vois que non
    .
    En tout cas, je vous remercie pour votre aide et votre promptitude.

    Bahan

  4. #4
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 889
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 889
    Par défaut
    Gege, question :
    Ne peut-il pas mettre dans les cases l'adresse de la chaine constante, c'est à dire quelque chose comme :

    .. Désolé mais là j'ai un trou

  5. #5
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Gege, question :
    Ne peut-il pas mettre dans les cases l'adresse de la chaine constante, c'est à dire quelque chose comme :

    "tutu" représente déjà une adresse, le problème c'est que si tu fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *s = "bonjour";
     
    if (s == "bonjour")
    ça marche (les adresses sont bien les mêmes), par contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char s[8];
     
    strcpy (s, "bonjour");
     
    if (s == "bonjour")
    ça ne marche plus, d'où l'interet de la fonction strcmp.

  6. #6
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 889
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 889
    Par défaut
    Et je pensais que dans le cas des chaines constantes, elles étaient placés une seule fois en mémoire et après référencées autant de fois que voulu ?

    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *p1 = "bonjour";
    char *p2 = "bonjour";
     
    if(p1==p2) {
       // TRUE
    }
    non ?

    Et sinon, pour en revenir au problème initial, étant donné que "bonjour" représente lui-même une adresse, le switch case devrait fonctionner ( même si il plante )

    Désolé pour les questions idiotes, j'ai une petite confusion la dessus

  7. #7
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par KiLVaiDeN
    Et je pensais que dans le cas des chaines constantes, elles étaient placés une seule fois en mémoire et après référencées autant de fois que voulu ?

    Par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char *p1 = "bonjour";
    char *p2 = "bonjour";
     
    if(p1==p2) {
       // TRUE
    }
    non ?
    Si j'ai écris casiment la même chose, deux posts plus haut

    Citation Envoyé par KiLVaiDeN
    Et sinon, pour en revenir au problème initial, étant donné que "bonjour" représente lui-même une adresse, le switch case devrait fonctionner ( même si il plante )
    Un entier constant ce n'est pas une adresse, même en castant le label, j'obtient :
    main.c:9: error: case label does not reduce to an integer constant
    Donc inutile d'insister, pour les chaînes de caractères c'est strcmp + if !

    Citation Envoyé par KiLVaiDeN
    Désolé pour les questions idiotes, j'ai une petite confusion la dessus
    On s'est tous posé la question

  8. #8
    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 KiLVaiDeN
    Et je pensais que dans le cas des chaines constantes, elles étaient placés une seule fois en mémoire et après référencées autant de fois que voulu ?
    Ce n'est pas garanti par le langage. de toutes façon, si on a copié la chaine dans un tableau de char, les adresses sont différentes, évidemment... (même si les contenus peuvent être identiques).
    Et sinon, pour en revenir au problème initial, étant donné que "bonjour" représente lui-même une adresse, le switch case devrait fonctionner ( même si il plante )
    Non. En C standard, le type doit être exclusivement int. Une adresse n'est pas un int.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     "g.c", line 36.30: 1506-051 (E) Case expression must be a valid 
    integral constant.
    Tu ne peux donc pas fais un case sur une chaine de caracteres.
    Essaie plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * pszVariable1;
    
    if (!strcmp(pszVariable1, "toto"))
     {traitement1}
    ...

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

Discussions similaires

  1. switch avec des chaines de caracteres
    Par sandesc dans le forum Général Java
    Réponses: 1
    Dernier message: 15/04/2011, 16h26
  2. afficher dans une chaine de caractere Switch.state
    Par mathiew dans le forum Développement iOS
    Réponses: 2
    Dernier message: 25/10/2010, 21h17
  3. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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