[강좌] C에서 입력 버퍼를 비울 때 피해야할 방법 (C언어를 배우자) |작성자 네가티브
#include <stdio.h>
int main(int argc, char *argv[])
{
int d;
while(1)
{
scanf("%d", &d);
printf("%d\n", d);
}
return 0;
}
실행해보시면 숫자를 입력할 시 그 숫자가 화면에 출력되는 형태로
무한 반복됨을 알 수 있습니다. 그런데, 여기에 문자를 입력하면 무한 루프에
빠지게 됩니다.
이걸 방지하고자 초보자들은 아래와 같은 코드를 작성하기도 합니다.
#include <stdio.h>
int main(int argc, char *argv[])
{
int d;
while(1)
{
fflush(stdin); // 입력 버퍼를 비운다.
scanf("%d", &d);
printf("%d\n", d);
}
return 0;
}
fflush(stdin);을 사용해서 입력 버퍼를 비우는 생각은 기발했으나...
이는 C 표준에서 '입력 버퍼 (stdin)'에 대하여는 정의되어있지 않은 것으로
Windows 기반에서만 제대로 동작됨을 확인한 방법입니다. 즉, 호환성을 떨어뜨리는 방법입니다.
( UNIX/Linux 계열 gcc에서는 fflush(stdin)은 곧 삽질입니다. )
( 이와 비슷한걸로 rewind(stdin); 있는데 역시 정의가 애매합니다. )
그렇다면 어떻게 해야할까요?
필자의 고민 끝에(?) 아래와 같이 해결해볼 수 있었습니다.
#include <stdio.h>
int main(int argc, char *argv[])
{
int d, temp;
while(1)
{
while(scanf("%d", &d) < 1)
{
printf("Wrong Number!\n");
while((temp = getchar()) != EOF && temp != '\n');
}
printf("%d\n", d);
}
return 0;
}
참고하세요.
'프로그래밍 > C·C++' 카테고리의 다른 글
콘솔 창 숨기기 (0) | 2011.07.04 |
---|---|
파일 관련 API (0) | 2011.05.10 |
maze 싱글 소스 (0) | 2010.08.11 |
readn() & writen() 코드, unpipc.h 파일 (0) | 2010.08.11 |
curses.h,ncurses.h 가 없을 경우 (0) | 2010.08.11 |