언어 자료구조 알고리즘/C11 표준 라이브러리 함수

fflush 함수[C언어 표준 라이브러리 함수 가이드]

언제나휴일 2016. 1. 3. 15:08
반응형

fflush


헤더 파일

[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - STDIO.H

 

int fflush ( FILE *fp); 파일 스트림 버퍼를 비우는 함수
 
입력 매개 변수 리스트
fp 파일 스트림
반환 값
성공 시 0, 에러 시 EOF
 
출력 스트림 버퍼에 남아있는 내용을 출력 스트림에 출력하는 동작을 수행합니다.
하지만 입력 스트림에서 어떻게 동작해야 하는지는 표준 문서에서 정의하지 않았습니다.
 
scanf 함수처럼 포멧에 맞게 입력을 받을 때 최종 사용자의 입력 내용이 포멧 문자열보다 더 많은 내용을 포함하고 있으면 버퍼에 처리하지 않은 데이터가 남습니다.
이처럼 스트림 버퍼의 내용을 비울 때 fflush 함수를 사용합니다.
하지만 C 표준 문서를 보면 구체적인 행위를 정의하지 않았습니다.
 
실제 컴파일러에 따라 처리하는 방식이 다릅니다.
저자가 테스트 해 본 Microsoft Visual Studio 2010에서는 제대로 버퍼를 비우지만 Microsoft Visual Studio 2015에서는 아무런 작업도 하지 않음을 확인하였습니다.
gcctc 등도 버전에 따라 다르게 동작합니다.
 
이에 관한 다른 의견이 계시면 jejutour@daum.net 으로 메일을 보내주세요.
 
사용 예
//C언어 표준 라이브러리 함수 사용법 가이드
//int fflush ( FILE *fp); 파일 스트림 버퍼를 비우는 함수
//두 개의 피연산자와 연산자를 입력받아 연산 결과를 출력
 
#include <stdio.h>
int main()
{
    int left,right;
    char op;
   
    printf("왼쪽 피연산자 : ");
    scanf_s("%d",&left);
    fflush(stdin); //표준 입력 스트림 버퍼를 비워줌
   
    printf("오른쪽 피연산자 : ");
    scanf_s("%d",&right);
    fflush(stdin);//표준 입력 스트림 버퍼를 비워줌
 
    printf("연산자 : ");
    scanf_s("%c",&op,sizeof(op));
    fflush(stdin);//표준 입력 스트림 버퍼를 비워줌
 
    //입력한 연산자에 따라 연산 결과를 출력함
    switch(op)
    {
    case '+': printf("%d\n",left+right); break;
    case '-': printf("%d\n",left-right); break;
    case '*': printf("%d\n",left*right); break;
    case '/':
        if(right)
        {
            printf("%d\n",left/right);
        }
        else
        {
            printf("divide zero\n");
        }
        break;
    default: printf("연산 기호를 잘못 입력하였습니다.\n"); break;
    }

    return 0;
}
 
출력(Microsoft Visual Studio 2010 이하 버전)
왼쪽 피연산자 : 23 abc (의도적으로 포멧 지정보다 많이 입력)
오른쪽 피연산자 : 12 hello (의도적으로 포멧 지정보다 많이 입력)
연산자 : + yahoo (의도적으로 포멧 지정보다 많이 입력)
35
 
출력(Microsoft Visual Studio 2015)
왼쪽 피연산자 : 23 abc (의도적으로 포멧 지정보다 많이 입력)
오른쪽 피연산자 : 연산자 : 연산 기호를 잘못 입력하였습니다.
 
이처럼 입력 스트림을 입력 인자로 fflush 함수를 사용할 때는 매우 신중하게 사용하셔야 합니다.

 


 

사용한 함수

[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - printf

[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - scanf_s

반응형