Comment faire un switch avec une variable string? [C++] - Programmation
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)
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)
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
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.
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 )
Code :
|
LEGREG
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
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).
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 !!!
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 :
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.
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
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);
Marsh Posté le 19-11-2001 à 13:37:13
je vois pas en quoi ce code est truffe de bug et/ou incomprehensible :
Code :
|
par contre j'avoue ne pas tres bien comprendre ton code
peux-tu un peu detailler stp, ca m'interresse
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 : 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
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 :
|
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
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?