Dauerschleife bei while Anweisung und Eingabe erzwingen
-
Hallo Community,
ich so als blutiger Anfänger habe zwei Fragen zu nem Testprogramm was ich gerade schreibe.
Code zu Frage Nummer1:
printf("\n\nBitte waehlen sie eines der Menuepunkte\n");
scanf("%d", &menupoint);
while (menupoint >= 4 || menupoint<=0)
{printf("\nBitte waehlen sie einer der Menuepunkte 1 bis 3");
scanf("%d", &menupoint);
}Wenn ich eine Zahl größer als 3 und kleiner als 1 Eingabe springt die While Schleife an und möchte eine neue Eingabe.
Wenn ich aber nun ne Char eingebe landet die While Anweisung in einer Dauerschleife wie kann ich das verhindern?Falls es sich besser lösen lässt als mit ner While könnt ihr mir auch gerne bescheid geben.
Frage Nummer 2:
bei getchar(); übernimmt er den wert erst nach eingabe von enter.
Was muss ich machen dass das Programm automatisch weiterläuft nach Eingabe einer beliegebigen Taste.Also nach dem Prinzip (Drücken sie eine beliebige Taste um fortzufahren)
Vielen Dank schonmal an all diejenigen die mich zumindest schonmal wahrnehmen.
-
Zu deiner ersten Frage:
Wenn du einen Buchstaben (oder eben eine nicht Zahl) eingibst, hol
scanf("%d", ..)
nichts aus dem Tastatuspuffer heraus. Wenn du nun den Aufruf wiederholst
wird wieder nichts aus dem Tastaturpuffer geholt, wodurch die
endlosschleife entsteht.Du musst also nach dem scanf(...) den Tastaturpuffer leeren.
Wie das geht, findest du hier im Forum.
Such mal nach fflush(stdin); dies ist übrigens verboten!
Daher danach suchen, dort findest du dann wie es gemacht werden kann.Gruß mcr
-
hi und willkommen im forum !
zu 1:
while ist schon ok dafür.
scanf liest aus dem puffer bis zum newline ( '\n' ) ein.
bei der eingabe eines buchstabens 'merkt' scanf anhand "%d", das keine buchstaben eingelesen werden sollen und spuckt den buchstaben wieder zurück in den puffer aus.
beim nächsten durchlauf 'denkt' sich scanf: ahaaa da ist noch was im puffer, weil dort kein '\n' steht, also liest scanf wieder den zuvor ausgespuckten buchstaben ein. das führt zu der endlosschleife.wenn du den puffer nach dem einlesen leer machst , dann klappts:
#include <stdio.h> void ClearBuf() { setvbuf( stdin, NULL, _IONBF, 0 ); setvbuf( stdin, NULL, _IOFBF, BUFSIZ ); } int main() { int i; do { puts( "Bitte waehlen sie eines der Menuepunkte 1-3" ); scanf( "%d", &i ); ClearBuf(); } while ( i > 3 || i < 1 ); return 0; }
wenn du aus den obigen erklärungen nicht gerade schlau geworden bist, dann erfährst du z.b. hier
http://www.galileocomputing.de/openbook/c_von_a_bis_z/
mehrzu 2:
folgt im nächten teil
-
gech() und getche() liefern den ascii code der gedrückten taste.
darum entweder den ascii code ( 0 -> 48, 1 -> 49, usw. )
oder die char interpretation '0', '1', usw. abfragen:#include <stdio.h> #include <conio.h> // Läuft unter Windows, ob es Linux und andere Systeme kennen, weiss ich nicht int main() { int c; do { puts( "\nBitte waehlen sie eines der Menuepunkte 1-3" ); //c = getch(); c = getche(); } while ( c > '3' || c < '1' ); return 0; }
-
-
gooood! Hab dann alles so weit hingekriegt Danke für die Hilfe!
Versuche das mit dem ClearBuf bis ins tiefste Detail zu verstehen aber mein Hirn blockt und meint es sei nicht wichtig solang es funktioniert.
Vielleicht schnall ichs mal.
Ansonsten vielen Dank für diesen Hilfsansatz.
-
setvbuf stellt den puffer ein.
die zeile
setvbuf( stdin, NULL, _IONBF, 0 );
setzt die puffergröße auf 0, der inhalt geht flöten.
die zeile
setvbuf( stdin, NULL, _IOFBF, BUFSIZ );
setzt den puffer zurück auf defaultwert der größe BUFSIZ ein.
thats all about.
http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_018_019.htm#RxxobKap01801904002A291F02118C