easy software

C언어 입력버퍼를 비우는 함수 본문

C언어/변수와 함수

C언어 입력버퍼를 비우는 함수

JAVA 웹개발자 2015. 2. 3. 22:11

안녕하세요. 이번시간에는 상당히 중요한 개념을 전해드리겠습니다.

 

입력 버퍼를 비우는 함수를 보여드릴텐데요,

 

우선 버퍼가 무엇인지부터 간단히 말씀드리겠습니다.

 

 

 

Buffer란?

 

입력버퍼와 출력버퍼가 있습니다.

 

일종의 임시저장공간으로써, 입력버퍼는 키보드로 부터 전해받은 문자들을 프로그램으로 바로 보내지

 

않고 버퍼에 모아두었다가 엔터키를 치면 프로그램으로 보내게 됩니다.

 

출력버퍼도 프로그램으로부터 받은 데이터를 바로 출력하지않고 버퍼에 모아두었다가 출력합니다.

 

 

 

간단한 예제를 통해서 왜 입력버퍼를 비우는 방법을 소개하는지 보여드리겠습니다.

 

 

int main(void){

char perID[7];

char name[10];

 

fputs("주민번호 앞 6자리 입력: ", stdout);

fgets(perID, sizeof(perID), stdin);

 

fputs("이름 입력: ", stdout);

fgets(name, sizeof(name), stdin);

 

printf("주민번호: %s \n", perID);

printf("이름: %s \n", name);

 

return 0;

}

 

 

위의코드는 주민번호 앞 6자리와 이름만 입력받기 위해 구현한 것입니다.

 

그런데 사용자 중에서는 프로그램에 익숙치 않아서,

 

주민등록번호 13자리를 모두 입력하는 경우도 있을 수 있습니다.

 

만약 사용자가 950709-1122345 를 입력했다면 어떤 출력결과를 보일까요?

 

 

출력결과

주민번호 앞 6자리 입력: 950709-1122345

이름 입력: 주민번호: 950915

이름: -1122345

 

 

사용자의 잘못된 입력으로 인해서 괴상한 출력결과를 보이고 있습니다.

 

위와 같은 일이 벌어지지 않게 하려면, 주민번호를 입력받을때

 

생년월일인 6자리만 저장하고 나머지는 지워버린 후 다시 입력받으면 되겠죠?

 

그래서 입력버퍼를 비우는 함수를 구현해서 추가하겠습니다.

 

 

 

void clearBuffer(void){
     //입력버퍼에 문자가 들어있으면,
     //문자를 모두 소모하여 버퍼를 비워버림
     //단순히 사용만하고 저장하지 않으면 비워지게 되는 원리 이용
     while (getchar() != '\n');
}

 

int main(void){

char perID[7];

char name[10];

 

fputs("주민번호 앞 6자리 입력: ", stdout);

fgets(perID, sizeof(perID), stdin);

clearBuffer(); //입력버퍼 비우기

 

fputs("이름 입력: ", stdout);

fgets(name, sizeof(name), stdin);

 

printf("주민번호: %s \n", perID);

printf("이름: %s \n", name);

 

return 0;

}

 

 

위와 같이 clearBuffer라는 함수를 작성해서 추가하면

 

생년월일을 아무리 길게 입력해도 정상적으로 이름을 입력받을 수 있게됩니다.

 

자세한 사항은 주석을 참고해주시기 바랍니다.

 

 

* 출력버퍼는 모니터로 결과를 보내버리는 것이 버퍼를 비우는 것입니다.

 

정의되어있는 int fflush(FILE * stream); 함수를 이용하여 처리할 수 있습니다.

 

매개변수로 stdout을 입력하면 모니터로 결과를 바로 출력하고 버퍼를 비우게 됩니다.

 

단, fflush함수를 이용해서 매개변수로 stdin을 전달하면 입력버퍼가 비워질까요?

 

사용하는 컴파일러에 따라서 달라질 수 있지만, 되는 경우가 있고 되지 않는 경우가 있습니다.

 

만약에, 운좋게 컴파일러가 stdin을 전달해도 입력버퍼를 비워준다 한들

 

fflush가 아닌 제가 구현한 함수를 이용하시기 바랍니다. 어떠한 문제가 발생할지 모르니까요.

Comments