Wie kann ich bei C++ die Eingabeaufforderung wiederholen, wenn der Nutzer ein unerwünschtes Zeichen eingibt?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Normalerweise würde man den Input einfach in eine Schleife packen, die solange läuft, bis der Input gültig ist. Sowas wie:

string s1, s2;
bool isInputValid = false;
while (!isInputValid)
{
   cout << "Bitte geben Sie ein Wort ein:";
   cin >> s1;

   // Validiere s1
   isInputValid = ...;
   if (!isInputValid) {
      cout << "Das war keine gültige Eingabe!";
   }
};
FelixFelix14 
Fragesteller
 06.12.2022, 16:05

Bei der Stelle mit 3 Punkten (validiere s1) würde ich gerne schreiben, dass nur die Buchstaben a-z erlaubt sind. Geht das so überhaupt? Wenn ja, wie genau mach ich das? Das weiß ich leider auch noch nicht. Würde mich über weitere Hilfe freuen. Danke!

0
PWolff  06.12.2022, 16:17
@ohwehohach

Das wäre für einen Anfänger didaktisch aber noch weniger geeignet als continue oder break in einer Schleife.

0
ohwehohach  06.12.2022, 16:20
@PWolff

Mag sein. Natürlich kann man auch in einer Schleife von vorne nach hinten durchgehen und dann Zeichen für Zeichen prüfen.

0
PWolff  06.12.2022, 16:24
@FelixFelix14

Letztlich ist ein char auch nichts anderes als eine Zahl (byte, int, uint o. ä.). Insbesondere lassen sich chars auch vergleichen.

Z. B.

s[i] >= 'a' && s[i] <= 'z'

Versuch aber bitte nicht, mit einem char zu rechnen - es ist nicht genau genug standardisiert, als was für eine Art Zahl ein char behandelt wird.

0
PWolff  06.12.2022, 16:26
@ohwehohach

Wo wir schon dabei sind: wenn man das invertierte string später nicht mehr braucht, hätte ich auch erwartet, dass die Zeichen des strings einzeln miteinander verglichen werden.

(Und ein string durch Anhängen einzelner Zeichen aufzubauen, kenne ich sonst nur von VBA, wo es manchmal keine andere Möglichkeit gibt.)

0
ohwehohach  06.12.2022, 16:34
@PWolff

Jo, den Algorithmus habe ich mir gar nicht angeschaut. Im Wesentlichen ist es ja für ein Palindrom auch völlig Wurst, ob da Buchstaben, Zahlen oder Sonderzeichen drinstehen, solange von vorne und von hinten gelesen dasselbe drinsteht.

Ich hätte sowas gemacht:

for (int i = 0; i < s1.length / 2; i++) {
  if (s1[i] != s1[s1.length - i - 1]) {
    cout >> "Kein Palindrom";
    return;
  }
}
cout >> "Ist Palindrom";
1
PWolff  06.12.2022, 16:40
@ohwehohach

Im ersten Moment dachte ich, eine Division in einer Schleifenbedingung? Eine Berechnung in einem Index? Aber die Division wird vom Compiler ja in ein shift umgesetzt und die Berechnung vermutlich auch zusammenoptimiert. Allerdings bestärkt mich das in meiner Meinung, dass C++ keine anfängerfreundliche Sprache ist.

Und im akademischen Bereich würde ich erwarten, dass es für direkte Ausgabe statt Funktion mit Rückgabetyp bool einen Punktabzug gibt.

0
ohwehohach  06.12.2022, 16:42
@PWolff
Und im akademischen Bereich würde ich erwarten, dass es für direkte Ausgabe statt Funktion mit Rückgabetyp bool einen Punktabzug gibt.

Einer meiner Informatikprofs hat damals mal gesagt, unser Quellcode ist ihm egal. Solange das Programm, wenn man es ausführt nicht abraucht und auf der Console das Richtige steht ist alles gut.

Da der obige Code ohnehin nicht prozedural ist, war's mir auch egal. Und warum sollte man in einer Schleifenbedingung nicht dividieren dürfen oder in einem Indexer berechnen? Klar, man könnte jetzt vorher eine Variable deklarieren, die s1.length / 2 enthält und dann würde nicht in jedem Schleifendurchlauf dividiert - aber mal ehrlich, da verlasse ich mich lieber auf den Optimizer als 2000 unnötige Variablen zu produzieren ;-)

1
PWolff  06.12.2022, 16:53
@ohwehohach

Für diese Aufgabe sehe ich es genauso.

Das mit den Funktionen kenne ich aus dem Informatik-Unterricht an der Schule.

Mit optimierenden Compilern zu rechnen ist gut und sinnvoll, aber bestimmt nicht anfängergeeignet.

Aber "solange das Programm nicht abraucht und für die üblichen Testfälle das Richtige ausgibt" kann leicht zu "worst practices" verführen, fürchte ich.

0
ohwehohach  06.12.2022, 16:57
@PWolff
Aber "solange das Programm nicht abraucht und für die üblichen Testfälle das Richtige ausgibt" kann leicht zu "worst practices" verführen, fürchte ich.

Das stimmt - aber das entmystifiziert ggf. wenigstens ein bisschen die falsche Denke, dass man an der Uni Programmieren lernt ;-)

Mit optimierenden Compilern zu rechnen ist gut und sinnvoll, aber bestimmt nicht anfängergeeignet.

Wobei ich obigen Code jetzt nicht wahnsinnig schwer zu verstehen finde. Und das Herausziehen der Berechnungen aus der Schleife/dem Indexer macht es ja nicht unbedingt verständlicher.

1