2013-08-11 4 views
16

에서 FFLUSH (표준 입력)의 사용은 무엇인가 내가 가지고있는 다음 프로그램C 프로그래밍

#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:"); 
} 

이 프로그램에 FFLUSH (표준 입력)의 사용은 무엇입니까?

+3

문서를 읽을 수 없습니까? –

+5

@MitchWheat 알고 계시 겠지만, 많은 플랫폼에서는 일부 동작이 정의되어 있기 때문에 많은 문서에서는'fflush (stdin)'을 언급하지 않을 것입니다. 처음에는 당황 스럽다는 것은 당연한 일입니다. (단, [Using fflush (stdin)] (http://stackoverflow.com/questions/2979209/using-fflushstdin))과 같은 중복 질문이 있어야합니다. – Gilles

답변

10

판독 전에 stdin 버퍼를 지 웁니다. 사람 page에서 : 출력 스트림에 대한

는 FFLUSH()는 모든 사용자 공간의 쓰기는 스트림의 쓰기 기능을 기본 통해 주어진 출력이나 업데이트 스트림 데이터를 버퍼링 강제로. 입력 스트림의 경우 fflush()는 기본 파일에서 반입되었지만 응용 프로그램에 의해 사용 된 이 아닌 버퍼링 된 데이터 을 삭제합니다.

주 :이 입력에 fflush()하지만, 대부분의 구현은 리눅스와 같은 동작 표준에 의해 정의되지 스트림하여, 리눅스 전용이다.

+0

위의 프로그램에서 fflush (stdin)이 작성되지 않았더라도 프로그램이 실행되지만 fflush (stdin)이 도움이 될 것입니다. 제안하십시오. – user2526830

+0

@ user2526830 당신이 무슨 말을하는지 잘 모르겠지만, 다시 읽기 전에 버퍼를 지우라고 말했듯이 말입니다. – iabdalkader

+1

@ user2526830 프로그램이 항상 다른 컴퓨터에서 제대로 실행되고, 다른 프로세스를 실행하며, 다른 시스템로드 하에서뿐만 아니라 컴퓨터에서 실행되는지 확인합니다. – TheCodeArtist

19

표준 C가 아니기 때문에 동작이 정의되지 않았습니다.

일부 구현에서는이 버퍼를 사용하여 stdin 버퍼를 지 웁니다.

C11 7.21.5.2 fflush 함수, fflush은 입력 스트림이 아닌 출력/업데이트 스트림에서만 작동합니다.

출력 스트림 또는 가장 최근 조작이 입력되지시킨 업데이트 스트림 스트림 점은 FFLUSH 함수가 스트림 대한 않은 데이터가 발생하는 경우에는 기록 될 호스트 환경으로 전달 될 파일; 그렇지 않은 경우 동작은 입니다.

+8

+1. 이것은 C 표준의 관점에서 볼 때 완벽합니다. 어떤 구현은 입력 스트림을'fflush()'하는 의미를 부여하지만, 이것은 확장이다. 리눅스 사용시 – glglgl

5

다음 줄 바꿈까지 입력 버퍼에서 모든 데이터를 제거하는 것은 이식 할 수없는 방법입니다. 내가 그런 경우에 사용 봤어요 : 당신이 문자를 입력하면, "A"를 말한다는 fflush()없이

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

, 그리고 히트 입력, 입력 버퍼 "는 \ n을을"을 포함 getchar()은 "a"를 엿보지 만 "\ n"은 버퍼에 남아 있으므로 다음은 fgets()이며 사용자 입력을 기다리지 않고 빈 문자열을 반환합니다.

그러나이 fflush()의 사용은 이식 할 수 없습니다. Linux 머신에서 지금 테스트를 해봤지만 작동하지 않습니다.

+0

: #INCLUDE clean_stdin 보이드 (공극) {INT의 C; do { c = getchar(); } while (c! = '\ n'&& c! = EOF); } https://stackoverflow.com/a/17319153/1925162 – Sunny127