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 wiestd::string
nimmst du entwederstd::map
oder baust dir mehrereif
/else if
-Kaskaden.
-
Da hatte jemand das gleiche Proble.
-
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
inmain()
.
-
Nexus schrieb:
Alfons2 schrieb:
Nur eine Frage noch, wie lautet der Befehl um eine Konsole frühzeitig zu beenden?
return
inmain()
.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 garabort()
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