PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : scanf/schleifen-problem



abcdeef
02-11-2005, 16:08
hallo,
ich will mittels scanf eine zeile bis zum ENTER einlesen; allerdings innerhalb einer schleife


while(1) {
...
scanf("%[^\n]",buf)
...
}

beim ersten mal klappt alles super; aber beim 2. schleifendurchlauf warten er nicht auf die benutzeringabe und rasselt in einer endlosschleife (scanf liefert 0 zurück und buf enthält noch die eingabe vom ersten durchlauf)

p.s. ich weiss, dass man das auch per scanf("%s"buf) machen kann, aber dann ist ENTER vor der eigentlichen eingabe erlaubt (z.b. ENTER,ENTER,"a",ENTER soll nicht erlaubt sein)

peschmae
02-11-2005, 16:11
Wieso nicht einfach die ENTER ohne Eingabe rausfiltern?

Ansonsten währe auch etwas lauffähiger Code noch gut zum testen.


Achso, habs schon. Hier was geht:


#include <stdio.h>

int main(int argc, char* argv[]) {
char buf[100];
while(1) {
printf("INPUT: "
scanf("%[^\n]",buf);
getchar();
printf("OUTPUT: %s\n", buf);
}
return 0;
}

Wieso gibt dein Code eine Endlosschleife? Wenn du dein Scanf machst wird gelesen und zwar bis zum \n heran. Das \n wird *nicht* gelesen, ergo verbleibt es im Inputbuffer. Wenn du nun das nächste mal liest ist der erste Char im Inputbuffer ein \n - also liest er alles vorher (nichts) und fährt weiter mit dem Code. Folglich die Endlosschleife.

Mein getchar() liest genau dieses \n aus dem Inputbuffer, also wird es dort raus gelöscht.


MfG Peschmä

abcdeef
02-11-2005, 16:18
naja, es soll folgendes verhindert werden:


# ENTER
ENTER
ENTER
ENTER
3r4f
#

"3r4f" ist die gewünschte eingabe. nach dem ersten ENTER soll er die acktuellen SChleifendurchlauf abgebrochen werden und mit "# " wieder auf neue eingabe gewartet werden.

p.s. wenn es auch anders geht?

abcdeef
02-11-2005, 16:21
thx, funktioniert; kann man den inputbuffer auch anders löschen?

peschmae
02-11-2005, 16:50
naja, es soll folgendes verhindert werden:

"3r4f" ist die gewünschte eingabe. nach dem ersten ENTER soll er die acktuellen SChleifendurchlauf abgebrochen werden und mit "# " wieder auf neue eingabe gewartet werden.

p.s. wenn es auch anders geht?

Wieso nicht ein:


while(1) {
...
scanf("%s",buf);
if (buf[0] == '\n')
continue;
...
}

oder so was in die Richtung. Die Eingabe musst du ja eh auf Validität überprüfen.



thx, funktioniert; kann man den inputbuffer auch anders löschen?

Einfach durch einlesen - getchar() ist halt für einen Char spezialisiert. Kannst auch scanf oder so benutzen.
Anders geht das nicht. (Einfach so alles löschen wäre auch nicht gut weil das z.B. ein Scripten des Inputs (einfach aus ner Datei auf stdin leiten) verhindern würde).

MfG Peschmä