일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- Spring email
- C언어 변수
- Naver SmartEditor
- jsp
- 자바
- 날짜
- HTML5
- C언어 메모리
- 역순
- gcc
- C언어 함수
- 포인터
- 오라클
- SQL
- placehoder
- Spring google
- URL 다운로드
- C언어 배열
- GUI
- java
- Vim
- TCP/IP 소켓
- C언어 매크로
- C언어 파일입출력
- 텍스트 파일 읽기
- Google reCaptcha
- Oracle
- C언어 구조체
- 구글 reCaptcha
- C언어
- Today
- Total
easy software
C언어 입력버퍼를 비우는 함수 본문
안녕하세요. 이번시간에는 상당히 중요한 개념을 전해드리겠습니다.
입력 버퍼를 비우는 함수를 보여드릴텐데요,
우선 버퍼가 무엇인지부터 간단히 말씀드리겠습니다.
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가 아닌 제가 구현한 함수를 이용하시기 바랍니다. 어떠한 문제가 발생할지 모르니까요.
'C언어 > 변수와 함수' 카테고리의 다른 글
C언어 strcmp(strncmp) 와 strcpy(strncpy) 함수 (0) | 2015.03.08 |
---|---|
C언어 문자열 함수 fgets() 을 이용해보자 (0) | 2015.02.03 |
C언어 getchar와 putchar를 이용하여 대소문자 변환하기 (0) | 2015.02.03 |
C언어 재귀적함수 응용 (0) | 2015.01.11 |
C언어 변수들을 적절히 활용하여 최대공약수 구하기 (0) | 2015.01.09 |