Text Befehle verarbeiten



  • Hi,

    Ich möchte ein Programm schreiben welches einfach Text Befehle verarbeitet.

    Programmablauf->
      Willkommen!
      String = Eingabe
      String analysieren
      Wenn string "richtig"
        Befehl ausführen
      sonst
        "Unbekannter Befehl"
    

    Die frage ist jetzt, wie macht man so was am elegantesten?

    Mir fallen nur riesige if-else Konstruke ein.
    Gibt es da vielleicht bessere Möglichkeiten?


  • Mod

    Du schachtelst das irgendwie. Dazu fällt mir spontan eine Map-Datenstruktur mit Zeichenketten als Schlüssel und Funktionszeigern als Werte ein. Ist aber verdammt viel Arbeit, wenn du das alles komplett selber basteln willst (gibt's vermutlich auch fertige Grundgerüste für). Das Endresultat wäre dann aber wirklich sehr eleganter Code.



  • Da habe ich jetzt nur was auf Wikipedia gefunden: (http://de.wikipedia.org/wiki/Assoziatives_Array)

    map<string, string> person;
    
    person[ "Vorname"    ] = "Hans";
    person[ "Name"       ] = "Mustermann";
    person[ "Geburtstag" ] = "01.01.01";
    person[ "Wohnort"    ] = "Musterstadt";
    cout << person["Name"];
    

    Scheint C++ und kein ANSI C zu sein.

    Probiert habe ich dann folgendes:

    map<char*, tr1::function> command;
    

    Fehler: Die Argumentliste für die Klassenvorlage "tr1::function" fehlt.



  • map ist Teil der STL (Standard Template Library) von C++.

    Nur mit C wird das eher aufwändig. Du kannst aber einen Blick auf Flex und Bison werfen.



  • GuttenTag schrieb:

    Mir fallen nur riesige if-else Konstruke ein.
    Gibt es da vielleicht bessere Möglichkeiten?

    Ass. Arrays gibt es in ANSI C nicht standardmäßig, ein einfacher Eigenbau ist aber auch nicht schwer:

    typedef void (*fptr)(int,int);
    
    void plus(int a,int b) {printf("\n%d+%d=%d",a,b,a+b);}
    void minus(int a,int b){printf("\n%d-%d=%d",a,b,a-b);}
    void mal(int a,int b)  {printf("\n%d*%d=%d",a,b,a*b);}
    
    char *fstr[]= { "plus", "minus", "mal" };
    fptr afptr[]= { plus, minus, mal };
    
    main(){
      int a,b;
      char f[20];
      while( 3==scanf("%19s%d%d",f,&a,&b) )
      {
        size_t s=sizeof fstr/sizeof*fstr;
        while( s-- )
         if( !strcmp(f,fstr[s]) ) afptr[s](a,b);
      }
      return 0;
    }
    

Anmelden zum Antworten