개인적으로 입력예외처리나 오류의 방지를 위해서 scanf를 쓰기보다
fgets로 chracter buffer을 잡아서 입력받은 다음 sscanf로 stdin을 처리하는 편입니다.
하지만 이런 경우 입력이 buffer의 허용수치 안에서 overflow되고 이 입력을 loop처리할 경우
overflow된 값만큼 다음 입력을 받지 않고 stdin내부에 남아있던 데이터를 입력 받은 것으로
처리해 수행을 하게 됩니다. 그렇기 때문에 stdin을 비워줘야 하는데요.
Visual C환경에서 이 작업은 fflush(stdin)이라는 형태의 함수가 지원합니다.
[이전의 야구게임 소스코드에도 활용되어 있습니다.]
하지만 이건 gcc에서는 동작하지 않습니다.
환경에 따라서 정상작동하는 경우도 있지만 그렇지 않은 경우도 있습니다.
그 이유는 fflush의 기본적인 정의가 출력버퍼(stdout 같은)에만
적용되도록 되어있기 때문입니다.
[왜 이 편한 기능을 stdin까지 확장 적용하지 않는지는 조금 의문입니다.
아시는 분은 알려주세요.]
그래서 이 기능을 굳이 구현하기 위해서는 직접 함수를 구현해야 하는데요.
제가 사용하는 함수는 다음과 같습니다.
라인입력이 끝나거나 파일이 종료되는 때까지 임시변수에 모든 stdin내부 버퍼를
집어넣어버리는 형태입니다. 더 효율적인 함수가 존재하는지는 모르겠네요.
[역시나 아시는 분은 알려주시면 감사하겠습니다.]
사실 윈도우 프로그래밍만 할 경우에는 신경쓰지 않아도 되는 부분이지만
리눅스나 다른 환경에서의 호환성을 생각할때에는 아무래도 이쪽이 더 좋겠지요.
[다만 문제는 저렇게 하면 버퍼가 이미 비어있는 경우 스탠다드 입력을 기다리게 됩니다.
이 문제까지 처리하려면 어떻게 해야할지는 고민 좀 해봐야겠네요.]
C++에서는 다른 방법도 존재하는 걸로 알고 있는데 제가 아직 C++을 제대로
공부하고 있지 않은 관계로 이건 나중에 알게되면 추가할까 합니다.
뭐 C++에서도 저정도의 함수는 작동할테니까요.
출처 : http://dpig.tistory.com/archive/20061105