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


Anmelden zum Antworten