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

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

Marsh Posté le 18-11-2001 à 14:30:05    

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?

Reply

Marsh Posté le 18-11-2001 à 14:30:05   

Reply

Marsh Posté le 18-11-2001 à 14:36:11    

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

Reply

Marsh Posté le 18-11-2001 à 15:09:15    

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)

Reply

Marsh Posté le 18-11-2001 à 15:12:23    

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

Reply

Marsh Posté le 18-11-2001 à 16:14:11    

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

Reply

Marsh Posté le 18-11-2001 à 16:16:38    

bref t parti pour les if/else

Reply

Marsh Posté le 18-11-2001 à 16:51:27    

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

Reply

Marsh Posté le 18-11-2001 à 16:53:21    

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

Reply

Marsh Posté le 18-11-2001 à 20:08:59    

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).

Reply

Marsh Posté le 19-11-2001 à 01:05:05    

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 !!!

Reply

Marsh Posté le 19-11-2001 à 01:05:05   

Reply

Marsh Posté le 19-11-2001 à 08:43:12    

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.

Reply

Marsh Posté le 19-11-2001 à 13:23:40    

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

Reply

Marsh Posté le 19-11-2001 à 13:28:07    

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);


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

Reply

Marsh Posté le 19-11-2001 à 13:37:13    

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
Reply

Marsh Posté le 19-11-2001 à 15:07:12    

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:

Reply

Marsh Posté le 19-11-2001 à 15:14:23    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed