Work | Posted by 흑목 2007/11/20 14:00

Visual Studio의 fflush 이야기

컴프 숙제를 하면서 사용자의 입력을 받는 interactive한 프로그램을 짜는데 이 때, scanf를 많이 사용하죠. 이 때 입력 오류 처리를 하기 위해서 fflush 함수를 많이 사용하는데, 이에 대해서 얘기를 해보려 합니다.

실제 프로그래밍에서 flush란 개념은 출력 버퍼에 남아 있는 출력해야 할 것들을 모두 출력하여(혹은 그냥 버려서) 출력 버퍼를 비운다는 개념입니다. 그런데 학생들이 Windows의 visual studio 환경에서 프로그램을 개발하면서, 다음과 같이 입력 버퍼를 비워버리곤 합니다.

   fflush(stdin);

Visual studio에서는 위의 코드를 사용하면 표준 입력 버퍼의 내용을 모두 비우긴 합니다만(MS에서는 flush의 개념을 확장하여 사용하긴 합니다.), 가끔 윈도우즈의 다른 개발환경(MS사가 아닌 다른 회사의 개발환경이나, 다른 언어, 또는 Windows가 아닌 다른 운영체제)에서는 위의 코드가 우리가 원하는 바, 즉 표준 입력 버퍼의 데이터를 비우는 작업을 수행하지 않는 경우가 있습니다.

사실, C 표준에서는 위의 code를 수행 했을 때 나타나는 결과는 정의되어 있지 않다(undefined). 라고 말하고 있으며, 대부분의 다른 언어에서도 이를 정의하고 있지 않거나, 무시하고 있습니다. 이 사실을 인지하고 있지 않는 많은 학생들이 VS에서 주로 사용하던 저 코드를 다른 환경에서 사용한 뒤 나타나는 프로그램 에러에 대해 적절한 대처를 하지 못하는 경우를 많이 보았습니다. 그러니깐 프로그램 에러가 나는 이유는 결국 다른 환경에서는 fflush(stdin); 코드가 제대로 수행되지 않기 때문이다. 라는 거죠.

결론은,
1. 프로그래밍에서 flush란 개념은 출력 버퍼를 대상으로 한 개념이다
2. 입력 버퍼를 flush하는 것은 정의되어 있지 않는 모호한 행동이며, 다른 개발 환경과 호환성이 없다.
입니다.

앞으로 컴프를 패스하게 되면 다른 여러 환경에서 프로그램을 짜게 될텐데, 도움이 될까 해서 몇자 적어보았습니다.

'Work' 카테고리의 다른 글

자원의 한계  (0) 2007/11/20
Visual Studio의 fflush 이야기  (1) 2007/11/20
TimeAttack  (0) 2007/03/29
Buffering Error  (0) 2006/05/18
Builder Listview Column Sorting  (0) 2006/03/31
Variant Conversion  (0) 2006/03/31