187
2014-04-11 20:40:58
1
fflush()는 단일문자이나 숫자 입력과는 별개로 생각하셔야합니다. 이것은 그냥 버퍼를 비우는 역할을 하는 겁니다.
왜 저부분에서 fflush()라는 함수를 써야만 했냐면, 먼저 scanf() 라는 함수에 대해 조금 이야기를 하고 넘어가야 하죠.
scanf()는 아마 학원에서 배운 대로 입력받는 함수입니다. 표준입력으로부터 입력받고 아마 버퍼가 비었다면 입력을 받을 때까지 계속 기다립니다. 그리고 엔터 키를 눌러야 입력이 된 것으로 인지합니다. 여기서 착각하면 안 되는게 여기서 숫자를 입력받았다, 문자를 입력받았다 따위의 데이터 타입을 상정하고 뭘 입력받았다 라고 생각하는 게 아닙니다. 그냥 '데이터 스트림'을 입력받은 겁니다. 입력받은 데이터는 '입력 버퍼'란 곳에 일단 저장됩니다.
이 입력 버퍼에서는 일단 사용자가 입력한 모든 내용이 기록됩니다. 엔터 키까지 포함해서요. 그리고 그 다음 scanf() 함수는 이 데이터 스트림으로부터 얼마만큼의 데이터를 취해서 사용자가 전달한 저장 공간에 데이터를 복사해줍니다. 그 얼마만큼은 %%c나 %%d 등의 서식문자열이 결정하는 거구요.
제가 엔터까지 버퍼에 읽힌다고 했었죠? 그런데 scanf 코드만 보면 따옴표 안에 딱 %%c만 있죠? 그러니 1바이트 char 형 하나만 읽을 것이고 엔터가 버퍼에 남아 있을 겁니다. 그래서 flush를 안 하면 두 번째 scanf에서는 버퍼에 엔터 하나만 남았을 겁니다. 근데, 어쨌든 엔터가 입력되어 있으니 두 번째 scanf는 사용자로부터 입력을 안 받습니다. 그래서 아마 fflush()를 쓰는 모양입니다.
그런데 대부분의 C 강의가 여기서 굳이 fflush를 쓰지 않아도 되는 방법이 있는데, 굳이 저 fflush()를 쓰더군요. 첫번째 scanf() 서식 문자열 %%c 뒤에 공백 하나만 붙이면 되는 데 말이죠. scanf 서식 문자열에서 공백의 의미는 모든 화이트스페이스는 무시하고 버리라는 의미입니다.