인프런 커뮤니티 질문&답변

뾱뾱님의 프로필 이미지
뾱뾱

작성한 질문수

홍정모의 따라하며 배우는 C언어

8.5 숫자와 문자를 섞어서 입력받기

3:20 getchar()

해결된 질문

작성

·

333

1

왜 갑자기 getchar() 이 나오는 건지 모르겠어요.

getchar가 아니라 scanf로 입력받았던 건데 왜 갑자기 getchar가 나오나요?

답변 2

5

scanf같은 입력함수들은 내부의 버퍼에 임으로 담겨졌다가, 사용시 끄집어내서 사용하는 방식입니다.

자세한 것은 입력함수들이 정의된 내용을 보아 동작방식을 알아야하나 이것은 너무 고급교육이고,

입력을 받을 때, int, float 등과 같은 숫자형은 '\n'자같은 개행문자들을 무시하고 출력하게 됩니다.

하지만 문자가 입력될때는 전혀 다른이야기가 되는데요,

보통 scanf 함수 쓰면서 앤터를 입력하시고 값을 입력하시는 경우가 있지요?

예를 들어서

char a;

char b;

scanf("%c",&a);

scanf("%c",&b);

가 있을 때, 입력할때 

a값 입력 - > 앤터 -> b값 입력 -> 앤터를 입력해보세요.

b값은 입력을 받지않고 바로 넘어가게 될겁니다.

왜냐, 과정을 보면은 'a'를 입력했습니다.

버퍼 ㅣ 'a'  |

그리고 앤터를 쳤습니다.

버퍼 | 'a' | | '\n' |

중요한 것은 변수 a에 'a'가 들어가게 되면서,

버퍼 |'\n'|

가 되는데 버퍼에 '\n' 개행문자가 남게 됩니다. 이것도 (char)형에선 문자죠.

그렇기 때문에 scanf의 b값 입력이 시작될 때, b값에 자동적으로 버퍼에 남은 '\n'이 들어가게 됩니다.

그래서 우리 눈에는 b값이 입력이 안된것 처럼 보일 뿐이죠.

실제론 a = 'a', b = '\n' 가 되버린 상황인 겁니다.

이것을 해결하기 위해선, 버퍼를 비우거나, 문자를 입력받는 getchar함수를 이용하는 겁니다.

버퍼를 비우는데는 fflush()같은 함수도 있지만 제가 알기론 공식 함수가 아닌것으로 알고(컴파일러에 따라 fllush가 작동 할 수 있고 안할수도 있음.), 그래서 getchar()를 쓰는데,

getchar 함수는 입력한 문자 하나를 반환하는 형식입니다.

int a = getchar();

를 하면 문자하나가 a에 들어갈겁니다.

즉, 

char a;

char b;

scanf("%c",&a);

getchar();

scanf("%c",&b);

아까와 같은 코드에서 getchar가 들어갔죠? 위의 문제가 되던 시점부터 보면,

버퍼 | 'a' | | '\n' |

a에 'a'가 들어갑니다.

버퍼 | '\n' |

에서 getchar함수가 '\n'을 받습니다. 그러나 getchar()도 문자를 반환하지만 따로 저장할 변수를 마련하지 않아서 그냥 버려집니다.

버퍼 ||

그럼 버퍼가 비워지고, scanf("%d",&b)가 실행됩니다.

비어져있기 때문에 자동으로 b값에 무언가 들어가지 않습니다. 

이상태에서 입력해주면 정상적으로 b값에 들어갑니다.

 

0

안녕하세요

해당 while문의 getchar() 는 버퍼를 비우는데에 사용됩니다. 

이전 강의인 8.4 강의에서 배우니 다시 참고해보시길 권장합니다.

뾱뾱님의 프로필 이미지
뾱뾱

작성한 질문수

질문하기