Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1220 connectés 

  FORUM HardWare.fr
  Programmation

  [C++] Comment faire un switch avec une variable string?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Comment faire un switch avec une variable string?

n°73259
Alload
Posté le 18-11-2001 à 14:30:05  profilanswer
 

J'ai essayé de faire comme ça:
 
string buffer;
 
....
 
switch (buffer)
{
case "test":
...
break;
 
case "test2":
...
break;
}
 
 
Mais ça marche pas, quelqu'un a une idée?

mood
Publicité
Posté le 18-11-2001 à 14:30:05  profilanswer
 

n°73262
verdoux
And I'm still waiting
Posté le 18-11-2001 à 14:36:11  profilanswer
 

Le switch marche avec un entier uniquement (ou un type qui a une conversion possible vers un entier)

n°73270
godbout
Génial.
Posté le 18-11-2001 à 15:09:15  profilanswer
 

Si je me trompe pas ca marche pour un char aussi, mais peut etre que c'est ce que tu voulais dire (ou un type qui a une conversion possible vers un entier)

n°73272
TheJackal
Posté le 18-11-2001 à 15:12:23  profilanswer
 

ben un char c un entier en faite
mais c juste un char et pas une chaine

n°73284
petoulachi
A fortiori, brigadier chef
Posté le 18-11-2001 à 16:14:11  profilanswer
 

Exact, le switch ne permet pas de tester des chaines de caracteres. C pareil en Java.

n°73285
chrisbk
-
Posté le 18-11-2001 à 16:16:38  profilanswer
 

bref t parti pour les if/else

n°73290
LeGreg
Posté le 18-11-2001 à 16:51:27  profilanswer
 

dans ton cas, tu fais juste un test
sur ton 5e charactere :)
(enfin si tu es sur qu'il n'y a que deux cas
sinon il manque manifestement un case default :D )
 

Code :
  1. switch(buffer[4]) {
  2.   case '\0':
  3.   ..
  4.   break;
  5.   case '2' :
  6.   ..
  7.   break;
  8. };


 
LEGREG

n°73291
LeGreg
Posté le 18-11-2001 à 16:53:21  profilanswer
 

je tiens evidemment a preciser
que ce genre d'optimisation est tres mauvaise :)
et donc a oublier absolument..
 
LEGREG

n°73357
wpk
Posté le 18-11-2001 à 20:08:59  profilanswer
 

ca depend de ce que tu veux faire mais tu peux utiliser une map et te servir du polymorphisme :
 
//interface
class A
{
  virtual void processCommand(...)=0;
};
 
class B : public A
{
   virtual void processCommand(...)
   {
   }
};
 
class C : public A
{
   virtual void processCommand(...)
   {
   }
};
 
map<string, A *>  commands;
 
 
void main(void)
{
  //phase d'initialisation
  commands["test"]= new B(...);
  commands["test2"] = new C(...);
 
  //utilisation:
  string buffer;
  ...
  map<string, A*>::iterator it = commands.find(buffer);
  if(it!= commands.end())
  {
    (*it).second->processCommand(...);
  }
  else
  {
    cout<<"Unknown command"<<endl;
  }
}
 
bon, vla en 30 sec ce ke je ferrais pour pas me prendre la tete et avoir du code un peu propre: fini les cases et les if imbriqués (j'ai pas du tout testé mais ca devrais marcher qd meme).

n°73403
C_Po_Ma_Fa​ute
Posté le 19-11-2001 à 01:05:05  profilanswer
 

wpk a écrit a écrit :

ca depend de ce que tu veux faire mais tu peux utiliser une map et te servir du polymorphisme :
 
//interface
class A
{
  virtual void processCommand(...)=0;
};
 
class B : public A
{
   virtual void processCommand(...)
   {
   }
};
 
class C : public A
{
   virtual void processCommand(...)
   {
   }
};
 
map<string, A *>  commands;
 
 
void main(void)
{
  //phase d'initialisation
  commands["test"]= new B(...);
  commands["test2"] = new C(...);
 
  //utilisation:
  string buffer;
  ...
  map<string, A*>::iterator it = commands.find(buffer);
  if(it!= commands.end())
  {
    (*it).second->processCommand(...);
  }
  else
  {
    cout<<"Unknown command"<<endl;
  }
}
 
bon, vla en 30 sec ce ke je ferrais pour pas me prendre la tete et avoir du code un peu propre: fini les cases et les if imbriqués (j'ai pas du tout testé mais ca devrais marcher qd meme).  




 
je trouve quand même tout ça un peu tiré par les cheveux pour tester le contenu d'une chaîne parmi quelques possibilités !!!

mood
Publicité
Posté le 19-11-2001 à 01:05:05  profilanswer
 

n°73411
wpk
Posté le 19-11-2001 à 08:43:12  profilanswer
 

c_est_ta_faute>
c'est bien pour ca ke j'ai mis
ca depend de ce que tu veux faire mais tu peux utiliser une map et te servir du polymorphisme :  :sol:  
 
Le post initial est trop maigre pour pouvoir presumer de l'utilisation future...
 
Je ferrais jamais ça qu'avec 2 string (et encore), je crois avoir ecrit ce genre de code (entre autres) pour un serv pop3 ou à priori, il n'y avait que kk chaines (commandes) à comparer, mais qui correspondaient à des etats differents d'un automate. Et je trouve le code plus bô comme ça qu'avec un imense if imbriqué qui traine sur 20 pages de code et qui est truffé de bugs.

n°73454
Carbon_14
Posté le 19-11-2001 à 13:23:40  profilanswer
 

Strstr(), c'est pas mal pour les comparaisons
char *strstr(const char *s1, const char *s2);                /* C only */
const char *strstr(const char *s1, const char *s2);          // C++ only

n°73456
flo850
moi je
Posté le 19-11-2001 à 13:28:07  profilanswer
 

strcmp est pas mal  non plus ( surtout que celle la ne fait que la comparaison , et c'est ce qui t'interesse ja crois )
morceaux choisi du man  
#include <string.h>
 
 int strcmp(
          const char *s1,
          const char *s2);


---------------

n°73460
HelloWorld
Salut tout le monde!
Posté le 19-11-2001 à 13:37:13  profilanswer
 

je vois pas en quoi ce code est truffe de bug et/ou incomprehensible :

Code :
  1. if(!strcmp(buffer, "test1" ))
  2. {
  3. }
  4. else if(!strcmp(buffer, "test2" ))
  5. {
  6. }
  7. else if(!strcmp(buffer, "test3" ))
  8. {
  9. }


 
par contre j'avoue ne pas tres bien comprendre ton code :D
peux-tu un peu detailler stp, ca m'interresse


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°73497
C_Po_Ma_Fa​ute
Posté le 19-11-2001 à 15:07:12  profilanswer
 

wpk a écrit a écrit :

c_est_ta_faute>
c'est bien pour ca ke j'ai mis
ca depend de ce que tu veux faire mais tu peux utiliser une map et te servir du polymorphisme :  :sol:  
 
Le post initial est trop maigre pour pouvoir presumer de l'utilisation future...
 
Je ferrais jamais ça qu'avec 2 string (et encore), je crois avoir ecrit ce genre de code (entre autres) pour un serv pop3 ou à priori, il n'y avait que kk chaines (commandes) à comparer, mais qui correspondaient à des etats differents d'un automate. Et je trouve le code plus bô comme ça qu'avec un imense if imbriqué qui traine sur 20 pages de code et qui est truffé de bugs.  




 
ok, ton code est bien plus élégant en effet lorsque la quantité de valeurs à tester devient importante  :jap:

n°73501
youdontcar​e
Posté le 19-11-2001 à 15:14:23  profilanswer
 

HelloWorld a écrit a écrit :

je vois pas en quoi ce code est truffe de bug et/ou incomprehensible :

Code :
  1. if(!strcmp(buffer, "test1" ))
  2. {
  3. }
  4. else if(!strcmp(buffer, "test2" ))
  5. {
  6. }
  7. else if(!strcmp(buffer, "test3" ))
  8. {
  9. }


 
par contre j'avoue ne pas tres bien comprendre ton code :D
peux-tu un peu detailler stp, ca m'interresse  



ce code marche très bien et n'est ni truffé de bugs, ni incompréhensible. le problème avec ce code est que lorsque tu ajoutes une nouvelle fonctionnalité, tu n'as pas qu'à rajouter du code, tu dois modifier ta boucle principale. cf cette pattern : http://users.vnet.net/wwake/xp/xp0012.shtml


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C++] Comment faire un switch avec une variable string?

 

Sujets relatifs
[php] url et variable**C** Comment scanner une string rentree par un utilisateur?
[ PHP ] Quelqu'un peut m'expliquer la fonction switch ?[C] Type d'1 variable comme paramètre à 1 fonction
[ HTML / PHP ] C'est possible une image de hauteur variable ?[XSL] Affectation de variable
HTML & largeur constante d'un string PHP[PHP][JS] nouvelle ligne dans une string...
[Visual Basic] - Initialiser un tableau de taille variable[php] passage d'une variable d'une page à l'autre ??
Plus de sujets relatifs à : [C++] Comment faire un switch avec une variable string?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR