2016-11-19 4 views
0

Ich dachte getchar() oder fflush(stdin) verwendet wurde, das Newline oder Raum, der von dem vorherigen Eingang links zu nehmen, weil die gets() Funktion nicht in der Lage ist, zwischen dem Newline zu unterscheiden und dem Eingang wir bieten. Wir brauchten diese nicht, wenn wir %s auf der scanf Funktion verwenden. Warum brauchen wir es, wenn wir %c oder %d für dieselbe Funktion verwenden?Verwirren über getchar() und fflush (stdin) Verhalten

+2

'fflush (stdin)' ist undefiniertes Verhalten – yano

Antwort

1

Tatsache ist, dass fflush() kein definiertes Verhalten für Eingabeströme hat, gibt es einige spezifische Implementierung definiert Verhalten. Auch gibt es fpurge() in glibc was macht was Sie wollen.

Wenn scanf() mit der Regel ist, dass es aufhören wird, wenn es ein weißer Raum findet als Zeichen von isspace() zurückgegeben, außer wenn %c mit denen anders verhält, als es Leerräume erfassen kann, oder ignorieren sie alle voraus, wenn sie von einem weißen Raum .

Auch die gets() Funktion ist gefährlich und wurde vor kurzem aus dem Standard entfernt, so dass Sie es nicht verwenden oder es als ein Beispiel bezeichnen sollten.

Die fgets()-Funktion, die eine bessere Version von gets() ist die letzte '\n' wenn es kann nicht erfassen, das heißt, wenn die Anzahl der bisher erfassten Zeichen überschreitet nicht den Wert der IT zweiter Parameter ist, so dass Sie brauchen nicht flush alles danach.

Sie sollten bedenken, dass scanf() nicht nur den letzten '\n' im Eingabepuffer hinterlässt, sondern auch alle Leerzeichen dahinter. So eine einzige getchar() ist in der Regel nicht genug, sollten Sie getchar() so viele Leerräume wie dort gelassen wurden, um das scheinbare Verhalten von fflush(stdin) zu gewährleisten.