Konsole



  • Guten Tag,

    ich habe hier vor etwas längerer Zeit einen Thread aufgemacht, mit der Frage wie man eine Konsole programmiert. Da hieß es ich sollte die Switch-Case Methode verwenden.

    Nun habe ich das mal probiert, aber mit dem Ergebniss, das ich immer nur ein Zeichen benutzen kann:

    case 't':                     
    cout << "test\n";  
    break;
    

    Kann man auch anstatt 't' nicht mehrere Zeichen einsetzen? weil so kann man doch keine gute Konsole schreiben, wenn ich immer nur einen Buchstaben angeben muss 😞

    Wenn ich dort nun 'test' reinschreibe, sagt er das die Zeichenkette zu lang ist. Gibt es eine Möglichkeit für mehrere Zeichen, die auch so einfach ist?

    Alfons



  • Was verstehst du unter einer Konsole?

    Nein, als case -Werte dürfen nur integrale konstante Ausdrücke verwendet werden. Für komplexere Dinge wie std::string nimmst du entweder std::map oder baust dir mehrere if / else if -Kaskaden.





  • Die switch-Anweisung funktioniert nur mit Ganzzahlen-Typen (int, char, short...). Wenn du C-Strings vergleichen willst, müsstest du es mit if-else-if und z.B. strncmp machen. Bei std::string kannst du dir dann das strncmp sparen und operator= nehmen.



  • wenn du viele befehle hast, könnte es sich aber durchaus lohnen, das switch drin zu lassen:

    std::string my_cmd;
    std::getline(std::cin, my_cmd);
    
    if(my_cmd.empty())
     //...
    
    switch(my_cmd[0])
    {
      case 't':
        if(my_cmd == "test")
          //...
        else if(my_cmd == "tt")
          //...
        else if(my_cmd == "t.....") //warum hab ich mir eigtl t raussuchen müssen? ^^
          //...
        break;
      case 'c':
        /*...*/
        break;
    }
    

    müsstest du dir nur noch überlegen, wie du dir jz merkst, ob es ein gültiges cmd war oder nicht... entweder mit nem continue am ende jeder behandlung des cmds oder mit nem bool...

    bb



  • Ahh, danke für die schnelle Hilfe

    ich baue mir also so eine tabelle, wie in dem anderen Thread da steht und kann dann z.B. hilfe eingeben und er gibt mir aus, was in dem Case 1 steht. Oder?

    EDIT:

    oh da war jemand schneller 😃

    Die Möglichkeit klingt auch einleuchtend

    Das einzige was ich merkwürdig finde, ist diese Zeile hier,

    std::getline(std::cin, my_cmd);
    

    ist das das selbe wie das hier?

    cin >> eingabe;
    


  • Nein, ist es nicht. Das erste liest dir die ganze Zeile (üblicherweise in einen std::string) ein und das zweite liest dir einen Wert mit dem Typen von "eingabe" ein. (Das kann ein Integer, ein string, ein float usw. sein, halt alles, wofür ein >>-Operator definiert ist).



  • Nun funktioniert es!

    Nur eine Frage noch, wie lautet der Befehl um eine Konsole frühzeitig zu beenden?

    Also das Prog läuft ja nun solange durch bis my_cmd exit ist. Nur dann muss er die Konsole ja auch schließen, aber wie?

    Danke für eure tolle Hilfe!!! 🙂 🙂



  • Alfons2 schrieb:

    Nur eine Frage noch, wie lautet der Befehl um eine Konsole frühzeitig zu beenden?

    return in main() .



  • Nexus schrieb:

    Alfons2 schrieb:

    Nur eine Frage noch, wie lautet der Befehl um eine Konsole frühzeitig zu beenden?

    return in main() .

    exit gäb's auch noch, aber ob das der Übersicht zuträglich ist, darf bezweifelt werden. 😉



  • Vorher stand bei mir noch:

    Nexus schrieb:

    (Nein, nicht sowas Unsauberes wie exit() oder gar abort() empfehlen!)

    Aber dann editierte ich das weg mit dem Gedanken, einen Versuch wärs wohl wert. Ich habe mich anscheinend geirrt. 😃

    Um das auch noch zu begründen: exit() ist nicht nur wegen der Übersicht nicht ratsam, sondern auch gefährlich. Das Programm wird unmittelbar abgebrochen, der Stack wird nicht mehr aufgeräumt, Destruktoren laufen nicht mehr. Hier vielleicht noch nicht tragisch, aber besser, man gewöhnt sich solche Dinge nicht an.



  • da hätte ich auch selber drauf kommen können 😮 😃

    Na egal, gut es funktioniert Prima

    Großes Dankeschön an euch alle hier, die geholfen haben!

    Alfons


Log in to reply