2013-08-11 10 views
16

Ich habe folgendes Programmwas ist die Verwendung von fflush (stdin) in C-Programmierung

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char ans[8]; 
    int i; 
    for(i=1;i<=3;i++) 
    { 
     printf("\n What is the unit of traffic ?"); 
     scanf("%s",ans); 
     fflush(stdin); 

     if(stricmp(ans,"Earlang")==0) 
     { 
      printf("\nAnswer is correct"); 
      exit(1); 
     } 
     else 
      if(i<3) 
      printf("\n Try Again!\n"); 
    } 
    printf("\n Nunit of traffic is Earlang:"); 
} 

Was ist die Verwendung von fflush (stdin) in diesem Programm?

+3

können Sie die Dokumente nicht lesen? –

+5

@MitchWheat Wie Sie vielleicht wissen sollten, wird in vielen Dokumenten "fflush (stdin)" nicht erwähnt, da es auf einigen Plattformen nur ein bestimmtes Verhalten hat. Es ist vollkommen normal, sich zuerst darüber zu wundern (aber es muss eine Menge doppelter Fragen zu SO geben, zum Beispiel [Using fflush (stdin)] (http://stackoverflow.com/questions/2979209/using-fflushstdin)). – Gilles

Antwort

10

Es löscht stdin Puffer vor dem Lesen. page von dem Mann:

Für Ausgangsströme, fflush() erzwingt das Schreiben aller User-Space Daten für die gegebene Ausgabe oder Update-Stream über den Stream der zugrunde liegenden Funktion Schreib gepuffert. Bei Eingabeströmen verwirft fflush() alle gepufferten Daten , die von der zugrunde liegenden Datei abgerufen wurden, aber nicht von der Anwendung verbraucht wurden.

Hinweis: Dies ist Linux-spezifisch, mit fflush() auf Eingangsströme durch den Standard nicht definiert ist, jedoch die meisten Implementierungen die gleichen wie in Linux verhalten.

+0

im obigen Programm, obwohl fflush (stdin) nicht geschrieben wird, wird das Programm ausgeführt, aber wie fflush (stdin) wird hilfreich sein. Bitte schlagen Sie. – user2526830

+0

@ user2526830 Ich bin mir nicht sicher, was Sie sagen, aber wie ich sagte, es löscht den Puffer vor dem Lesen wieder. – iabdalkader

+1

@ user2526830 Es wird sichergestellt, dass das Programm auf verschiedenen Rechnern, die verschiedene Prozesse ausführen, immer unter verschiedenen Systemlasten und nicht nur auf Ihrem Rechner ausgeführt wird. – TheCodeArtist

19

Es ist nicht in Standard C, so ist das Verhalten undefiniert.

Einige Implementierung verwendet es, um stdin Puffer zu löschen.

Von C11 7.21.5.2 Die fflush-Funktion, fflush funktioniert nur mit Ausgabe/Update-Stream, nicht Eingabe-Stream.

Wenn Strom Punkte zu einem Ausgangsstrom oder eine Aktualisierungsstrom, in dem die jüngsten Operation war nicht eingegeben wird, die Fflush Funktion keine ungeschriebenen Daten für diesen Strom verursacht bis an die Host-Umgebung geliefert werden, geschrieben die Datei; Andernfalls ist das Verhalten undefined.

+8

+1. Das ist vollkommen richtig, aus der Sicht des C-Standards. Einige Implementationen geben eine Semantik für einen Eingabestrom, der jedoch eine Erweiterung ist. – glglgl

5

Es ist eine unportable Möglichkeit, alle Daten aus dem Eingabepuffer bis zum nächsten Zeilenumbruch zu entfernen. Ich habe es in solchen Fällen, dass verwendet gesehen:

char c; 
char s[32]; 
puts("Type a char"); 
c=getchar(); 
fflush(stdin); 
puts("Type a string"); 
fgets(s,32,stdin); 

Ohne die fflush(), wenn Sie ein Zeichen eingeben, sagen „a“ und der Hit eingeben, enthält der Eingangspuffer „ein \ n“, die getchar() guckt auf das "a", aber das "\ n" bleibt im Puffer, so dass das nächste fgets() es finden und eine leere Zeichenfolge zurückgeben wird, ohne auf Benutzereingaben zu warten.

Beachten Sie jedoch, dass diese Verwendung von fflush() nicht portierbar ist. Ich habe es gerade auf einem Linux-Rechner getestet, und es funktioniert zum Beispiel nicht.

+0

In Linux: #include Hohlraum clean_stdin (void) { int c; do { c = getchar(); } while (c! = '\ N' && c! = EOF); } https://Stackoverflow.com/a/17319153/1925162 – Sunny127

Verwandte Themen