PS/자주 하는 답변

fflush(stdin), rewind(stdin)은 표준이 아닙니다.

djm03178 2023. 1. 3. 12:24

이 글은 제가 처음 프로그래밍을 접했던 약 15년 전부터 아직까지도 끊임없이 보고 있는 것에 대한 이야기입니다.

 

결론부터 말해서, C 표준에서 stdin의 버퍼를 비워주는 라이브러리는 없습니다. 흔히 fflush(stdin), rewind(stdin)을 사용하여 버퍼를 비우는 기법이 알려져있지만 이는 어디까지나 특정 라이브러리 (제가 아는 한에서는 Visual Studio만)에서 확장 기능으로 그런 사용법도 제공할 뿐이지, 표준상에서는 stdin에 대해 아예 사용이 안 되는 함수들입니다.

 

보통 scanf로 정수를 입력받고 다음 줄 전체를 fgets 등으로 읽어오고 싶을 때, 정수 뒤에 남아있는 공백을 지우고 싶어서 많이 사용하게 될 건데, 이걸 fflush나 rewind 등으로 지우려고 하면 안 됩니다. 대체할 수 있는 쉬운 방법이 많이 있습니다.

 

우선, 정수 뒤에 바로 개행 문자가 오는 것이 보장되어 있다면, 그냥 다음과 같이 getchar를 한 번 호출해주면 됩니다.

int n;
scanf("%d", &n); // 또는 C++에서 cin >> n;
getchar(); // 또는 C++에서 cin.get() 또는 cin.ignore();

정수 뒤에 다른 문자들이 더 있을 수 있는데 무시하고 싶나요? 다음과 같이 하면 됩니다.

int n;
scanf("%d", &n); // 또는 C++에서 cin >> n;
while (getchar() != '\n'); // 끝의 세미콜론 주의!!

다른 방법으로는 fgets나 getline으로 나머지 부분을 임시 변수에 저장해버리거나, 처음부터 scanf가 서식에서 개행 문자까지 다 읽고 그대로 버리도록 해주는 것도 있습니다.

 

절대로 문제를 풀 때 fflush(stdin), rewind(stdin)을 쓰지 마세요. 채점 서버에서는 동작하지 않습니다.