switch-case mit Wörtern
-
Gibt es eine eingermaßen elegante Lösung, um Übergabe-Parameter (ganze Wörter) von Konsolenapplikationen mit switch-case auszuwerten? Lösungen mit if-then-else sind nicht erwünscht.
zwette
-
Das switch-Konstrukt akzeptiert keine Strings.
Genausowenig ist ja möglich if(str == "Hallo") zu schreiben.
-
vielleicht hilft ja das auch wenn if then nicht erwünscht.
if ((strncmp (argument,"exit",4)) == 0)
{
printf ("test");
}meesta
-
normalerweise macht man das mittels einer map (zB hashmap) - ist allerdings kein standard
musst deswegen selber nach ner guten implementierung suchen
-
Shade Of Mine schrieb:
normalerweise macht man das mittels einer map (zB hashmap)
Für die "Übergabe-Parameter von Konsolenapplikationen"?
-
Daniel E. schrieb:
Für die "Übergabe-Parameter von Konsolenapplikationen"?
Ja, zumindest funktioniert mein Parser so.
Du trägst alle möglichen Argumente in eine map ein und dann kann man einfach testen:
if( is_in(arguments, argv[1] ) { }
und schon weiss man, ob das 'argument' erlaubt ist. bzw mittels
if( is_in(arguments, argv[1] ) { get_function(arguments, argv[1])(); }
ruft man die passende Funktion auf (Funktionszeiger)Also gehen tut es. Wie würdest du es machen? (von strcmp() mal abgesehen, da diese Lösung nicht sehr flexibel ist)
-
@zwette
Also ich mach das immer so:#define MAX_BEFEHLE 3 char eingabe[100]; ... switch(parse(eingabe)) { case -1: printf("Unbekanntes Kommando"); break; case 0: printf("Addiere"); break; case 1: printf("Subtrahiere"); break; ... } ... int parse(char *eingabe) { char befehle[MAX_BEFEHLE][]={"add ", "sub ", "multi "}; int i; for(i=0;i<MAX_BEFEHLE;++i) { if(!strncmp(befehle[i], eingabe, strlen(befehle[i])) { return(i); } } return(-1); }
-
schaff dir eine struct und darauf ein array und prüfe
typedef struct befehl_t{ int bnr; /*bnr bei 1 beginnen, da 0 reserviert für ungültig */ char[...] command; }; struct befehl_t befehl[x]; .. int main(){ char eingabe[..]; int befnr; if (befnr=checkcommand(eingabe) switch (befnr){ case 1:.... } else Fehlermeldung; .. return 0; } /*Prüfroutine int checkcommand(char *eingabe){ int i = 0; while (strcmp(eingabe, befehl[i].command) && i<=x)i++; return (i<=x?befehl[i].bnr:0); }
-
@anders
Und was ist daran recht viel anders als bei mir??