Programming Language/C/C++

[C/C++] fflush 함수

깐요 2017. 3. 10. 22:00

fflush 함수

함수의 인자에 해당하는 입출력 버퍼를 지울 때 사용한다

내용을 입력하고 ENTER 를 입력할 때 '\n' 는 아래 그림처럼 버퍼에 남게 된다

이러한 경우를 없애기 위해서 fflush(stdin) 명령어를 사용한다

보통 반복문 끝에 사용한다



단, fflush 는 버퍼에 있는 데이터를 그냥 지우는 것이 아니라 출력하고자 하는 곳으로 전송한다

입력버퍼를 비우기 위해서는 버퍼에 있는 데이터를 읽어들이면 된다


void insert_line(LinkedListType *buffer)
{
    int position;
    char line[MAX_CHAR_PER_LINE];
    element p;
 
    printf("입력행번호를 입력하세요: \n");
    scanf("%d", &position);
 
    printf("내용을 입력하세요: ");
    fflush(stdin);
    
    fgets(line, MAX_CHAR_PER_LINE, stdin);
    strcpy(p.a, line);
    add(buffer, position, p);
    display(buffer);
}

위 코드는 내용을 입력받아 연결리스트에 삽입하는 함수이다

fflush(stdin) 을 이용하여 버퍼를 처리하면 결과는 다음과 같다



이러한 결과가 나타나는 이유는

fgets 함수가 버퍼에서 문자들을 읽어올 때 내용을 저장할 변수(sizeof(변수)) 의 크기만큼 문자를 읽는다

그 크기가 입력한 내용의 크기보다 작게 되면 입력한 내용의 중간에 NULL문자를 넣는다

그러면 버퍼에는 값들이 남아있기 때문에

다음에 fgets 함수는 그 값들을 읽어들이게 된다


이러한 경우를 해결하는 방법은 버퍼 안의 \n 을 읽을 때까지 데이터를 읽으면 된다

이는 while ( getchar() != '\n') 을 사용하면 가능하다


void insert_line(LinkedListType *buffer)
{
    int position;
    char line[MAX_CHAR_PER_LINE];
    element p;
 
    printf("입력행번호를 입력하세요: \n");
    scanf("%d", &position);
    printf("내용을 입력하세요: ");
    fflush(stdin);
    while ( getchar() != '\n' );  //버퍼 안의 \n 까지 데이터를 읽는다
    fgets(line, MAX_CHAR_PER_LINE, stdin);
    strcpy(p.a, line);
    add(buffer, position, p);
    display(buffer);
}


단, 이 방법은 \n 이 버퍼에 남아있어도 버퍼를 비우지 않는 경우에는 효과를 보지 못하는 한계가 있다

상황에 따라 잘 사용하도록 하자

320x100