ANSI C - Switch mit *char
-
Hallo,
ne kleine Frage.Gibt es eine Möglichkeit einen Switch mit einem Char Array bzw. Char Pointer zu kombinieren, damit ich nicht 20 strcmp() schreiben muss?
Folgedes kleines Beispielcoding:
int main() { char *arr="Test"; switch () // ???? { case 'Test': // ???? printf ("Eingabe war test"); break; default: printf ("Eingabe war irgendwas anderes"); break; } return 0; }
Wäre super wenn man in der Switchanweisung das irgendwie abfackeln könnte...
Denn sonst müsste ich ca. 20 strcmp() Anweisungen im if schreiben.Bei einzelnen Chars geht das ganze ja....
Danke
-
Du kannst ja durch eine for-Schleife mit einer Stringliste vergleichen:
char *Liste[] = { "Hase", "Igel", "Tiger", "Ente", "SchweineImWeltall", 0 };
-
keksekekse schrieb:
Du kannst ja durch eine Schleife mit einer Stringliste vergleichen:
char *Liste[] = { "Hase", "Igel", "Tiger", "Ente", "SchweineImWeltall", 0 };
Joa
in C++ gibts ja ne Workaround/Hack dafür:http://www.codeguru.com/cpp/cpp/cpp_mfc/article.php/c4067/
Dort ist es zwar mit String-Klassen gelöst... aber vielleicht gibts sowas ja auch für ANSI C?
Sowas in der Richtung meinte ich
-
codefrag schrieb:
aber vielleicht gibts sowas ja auch für ANSI C?
Sowas in der Richtung meinte ichso wie's kekskekse es angedeutet hat
#include <stdio.h> #include <string.h> int string_in_array (char **array, int arraysize, char *search) { while (--arraysize >= 0) if (strcmp(array[arraysize], search) == 0) return arraysize; return -1; } int main (void) { char *strings[] = {"pale", "dog" , "rocks"}; printf ("found:"); switch (string_in_array (strings, sizeof(strings)/sizeof(char*), "sucks")) { case 0: printf ("first\n"); break; case 1: printf ("second\n"); break; case 2: printf ("third\n"); break; default: printf ("none\n"); break; } }
-
pale dog schrieb:
codefrag schrieb:
aber vielleicht gibts sowas ja auch für ANSI C?
Sowas in der Richtung meinte ichso wie's kekskekse es angedeutet hat
Ahh alles klar ....
Wenn man die Case-Werte ins Array schreibtich hatte ihn genau andersrum verstanden..
Klasse! Danke
-
codefrag schrieb:
Ahh alles klar ....
Wenn man die Case-Werte ins Array schreibthuh
wie bitte?
-
pale dog schrieb:
codefrag schrieb:
Ahh alles klar ....
Wenn man die Case-Werte ins Array schreibthuh
wie bitte?Na ich meine... es wird ein char array mit den möglichen "Case Werten" erzeugt und dann dieses mit einer Schleife durchlaufen
Hatte dich am Anfang nur falsch verstanden
Funktioniert ja
-
pale dog schrieb:
int main (void)
iiiiiieeeeehhhh!!!!!
pale dog schrieb:
sizeof(strings)/sizeof(char*)
Geht nur bei Arrays fester Größe
Für ein dynamisches Array kann man entweder einen Zähler benutzen oder (wie oben in meinem Beispiel ein Stop-Element anhängen (meist der Zeiger-Wert 0)
-
keksekekse schrieb:
pale dog schrieb:
int main (void)
iiiiiieeeeehhhh!!!!!
naja, früher hab ich immer 'void main()' geschrieben, hat aber auch keinem gefallen
-
keksekekse schrieb:
pale dog schrieb:
int main (void)
iiiiiieeeeehhhh!!!!!
wo ist das Problem damit? int main(void); ist eine der zulässige main Varianten.
-
supertux schrieb:
wo ist das Problem damit? int main(void); ist eine der zulässige main Varianten.
http://www.c-plusplus.net/forum/viewtopic-var-p-is-284489.html
Du hast recht zumindest nach Standard C99. Habe ich nicht gewußt.
Andererseits wird der Funktion main() vom Startcode int argc und char *argv[] zur Verfügung gestellt.
push [envp] ; (Borland?) Array von Zeigern auf Umgebungsvariablen push [argv] ; Array von Zeigern auf von setargv() geparste Kommandozeilenparameter push [argc] ; Anzahl der von setargv() geparsten Kommandozeilenparameter call _main ; main() himself push eax ; Rückgabewert oder der Wert, der "zufällig" in eax steht call _exit ; der Exitcode kann über ERRORLEVEL (*.bat) oder über GetExitCode() abgefragt werden ; und *das* ist vom Programmierer nicht vorherzusehen, auch wenn ; es nicht sehr wahrscheinlich ist
Zum Thema int/void main()
http://www.volkard.de/vcppkold/klasse_nimmspiel__void_main_oder_int_main.html
-
keksekekse schrieb:
supertux schrieb:
wo ist das Problem damit? int main(void); ist eine der zulässige main Varianten.
http://www.c-plusplus.net/forum/viewtopic-var-p-is-284489.html
Du hast recht zumindest nach Standard C99. Habe ich nicht gewußt.
Andererseits wird der Funktion main() vom Startcode int argc und char *argv[] zur Verfügung gestellt.
Aber niemand zwingt dich, diese Parameter zu beachten
(und in C bedeutet eine leere Parameterklammer etwas anderes als ein (void) ;))
-
-
Be warned that if you post your "void main" code on the forums, you're going to get told to correct it. Responding with "my teacher said it's OK" is no defence; teachers have a bad habit of being wrong. Be safe, and post only standard code, and you'll find people concentrate on answering your other problems, rather than waste time telling you about this type of thing.
So isses
-
Einen hab ich noch, einen hab ich noch...
#include <conio.h> #include <stdio.h> #include <string.h> /* Structures and Functions */ typedef int (tfunc)(int i); struct tstrfunc { char *pcstr; tfunc *pfunc; }; tfunc *a_str_switch(struct tstrfunc *psf, char *pcstr) { int i; for (i = 0; psf[i].pcstr; i++) if (strcmp(psf[i].pcstr, pcstr) == 0) break; return psf[i].pfunc; /* always return a valid pfunc */ } /* actual functions */ static int ffirst (int i) { printf("first %i\n", i); return 1; } static int fsecond (int i) { printf("second %i\n", i); return 2; } static int fdefault(int i) { printf("default %i\n", i); return 3; } int main() { /* actual data */ static struct tstrfunc pstrfunc[] = { { "first", ffirst }, { "second", fsecond }, { 0, fdefault } /* Mark End as { 0 and default func } */ }; /* - - - - - - - - - - - - - - - - - - */ a_str_switch(pstrfunc, "second")(43331); /* - - - - - - - - - - - - - - - - - - */ getch(); return 0; }