본문 바로가기
프로그래밍/C·C++

C에서 입력 버퍼를 비울 때 피해야할 방법

by ITPro 2010. 8. 11.

원문[강좌] 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

바로가기