C (y/n) char Kontrol loop funktioniert nicht?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Einmal zur Erklärung:

cRestart != ('y' || 'n');


Abgesehen davon, dass dem Schleifenfuß noch eine 2. schließende Klammer vor dem Semikolon fehlt, wird die Bedingung anders ausgewertet, als du es erwartest.

'y' || 'n'


Beide Character existieren, sind nicht 0. Somit wird der Ausdruck ausgewertet als true oder true. Dies ergibt true. So lange nun cRestart nicht true ist (bzw. false / 0), läuft die Schleife. Insgesamt kommst du also auf nur einen einzigen Durchlauf, aufgrund der Tatsache, dass der Rumpf mindestens einmal ausgeführt wird.


Die Bedingung sollte daher so, wie von allfly unten geschrieben, aussehen.

Neben den von anderen entdeckten Fehlern gibt es noch eine Art Katastrophe, die zu schwerwiegenden Sicherheitslücken führen kann:

Dein scanf()-Aufruf liest keinen einzelnen Character, sondern einen String mit der Länge 1, was insgesamt 2 Character sind, da ein Nullzeichen automatisch ans Ende angefügt wird.

Wenn deine Variable "cRestart" jetzt als einzelner "char" deklariert ist, wird deshalb ein zusätzliches Byte auf dem Stack mit Null überschrieben.

Falls cRestart hingegen als Array wie z. B. "char cRestart[2]" deklariert ist, musst du in deiner while-Schleife entweder "*cRestart" der "cRestart[0]" nutzen, um auf das erste Zeichen zugreifen zu können.

Aber lass dich jetzt nicht demotivieren, falls dich das noch überfordern sollte! Jeder hat am Anfang mehr Fehler gemacht, als funktionierenden Code zu produzieren. Lern einfach ordentlich weiter, und überstürze (!) nichts. Lern in aller Ruhe ein Kapitel oder eine Lektion nach dem / der anderen.

Wenn die Grundlagen erst mal sitzen, machst du automatisch keine solchen Fehler mehr, wie in deinem obigen Code-Schnipsel!

Also lege dein nicht-funktionierendes Mini-Progrämmchen jetzt mal beiseite, und arbeite einfach erst mal die Übungen aus deinem Buch oder Tutorial durch.

Viel Erfolg! :)

Es wird so lange wiederholt bis du was anderes eingibst als y oder n

Eben nicht, das ist ja das Problem.

0
@KUNDENDlENST

Richtig, mein Fehler. Gibt doch in der schleife mal cRestart aus und sieh nach was drin ist

0
@KUNDENDlENST

Ist es ein Problem dass die Variable ein char sein soll, du aber einen String einliest?

0
@allfly

Das muss ich leider so machen. Macht aber keinen Unterschied.

0
@KUNDENDlENST

Außerdem kann man das nicht so schreiben:

cRestart != ('y' || 'n')

Probiers mal so

while(cRestart != 'y' && cRestart != 'n')
2

Was möchtest Du wissen?