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

박병현님의 프로필 이미지
박병현

작성한 질문수

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

8.4 사용자 인터페이스는 친절하게

질문입니다

작성

·

263

2

1분 40초쯤에

while(getchar()!='\n'); 

continue;

를 안써줘서 \n 도 버퍼에 들어와서 count가 두번됐다고 하셨는데, 디버깅을 해보니 예를들어 처음 잘못된 코드에 y를 입력하고 엔터를 누르면, count++를 만나 count 가 하나 증가하고 다시 while문이 반복되어 printf가 실행되고 또다시 if문을 만나는데 그 안에 getchar가 있으니까 또다시 입력을 받아야 하지 않나요? 왜 getchar 를 무시하고 바로 count++로 가서 바로 2가 또 출력되는지 잘 모르겠습니다.

답변 5

1

첫 번째 질문에 좀 더 자세히 적어드려야 했군요. printf 는 독립적이니 신경쓰지 않으셔도 됩니다.
getchar가 무시되는 것이 아닙니다.

1. while 문의 1st iteration 시작.
2. getchar 에서 입력 대기.
3. y 와 enter를 입력 => buffer를 통해 y\n 이 보내짐.
4. getchar 가 y를 받고 while문의 1st iteration 종료 => 2nd iteration 시작 //count ++
5. \n가 아직 buffer에 남아있으므로 2nd iteration은 getchar가 \n을 받으면서 종료 => 3rd iteration 시작 //count ++
6. getchar 에서 입력 대기
...
순으로 실행됩니다.

질문자님의 표현을 보고 추측하건데 buffer가 뭐하는 녀석인지, 왜 필요한지에 대한 고민이 조금 더 필요해보입니다. 여전히 모르시겠다면 이쪽 방향으로 고민해보세요.

0

박병현님의 프로필 이미지
박병현
질문자

그렇다면 버퍼를 지워주는 역할을 하는 while 문이 없다고 생각할 때에 y 와 \n을 입력하는 것을 생각해보면

y입력=> y버퍼로 이동 => \n입력 => n버퍼로 이동=>count++만나 count 증가 => printf문 실행=> if문 을만남=>"getchar을 만나 입력을 받음!!" 이 과정이 왜 생략되는지 잘 이해가 가지않습니다ㅜㅜ

y입력=> y버퍼로 이동 => \n입력 => n버퍼로 이동=>count++만나 count 증가 => printf 1 실행=> if문 을만남=> getchar()을 무시하고 count++ 실행 => print 2실행 => getchar()을 만나 입력대기

이게 맞는 과정인것같은데 왜 전자의 getchar가 무시되는 지 모르겠습니다.ㅜㅜ

0

y를 누르고 엔터를 누르면 버퍼를 통해서 보내집니다.
그러면... 버퍼에는 y 와 \n이 존재하는데
처음에 if 문 내의 getchar를 통해서 하나가 비워지고,
나머지는 그 아래 while문을 통해서 \n을 만날때까지 버퍼가 비워집니다.


또하나 예를 들어드리면...
yawoeifjawoeijcwioej\n 를 입력하면 이게 버퍼를 통해 전달됩니다.
y는 if문의 getchar에서 잡아가며,
awoeifjawoeijcwioej\n 는 while 문에서 getchar가 \n을 잡을때까지 while문이 계속 반복되어서 buffer clear 를 해주는 역할을 합니다.
그 다음 outer while이 다시 실행되어 입력을 기다리는겁니다.(break 를 못 만났으니)


구체적인 예를 생각해가면서 차근차근 디테일하게 보시면 도움이 될 것 같네요.(생각만이 아니고 코드로 확인도 하셔야합니다.) 버퍼 강의를 다시보시는것도 좋아보입니다.

0

박병현님의 프로필 이미지
박병현
질문자

근데 코드가 while(getchar() != '\n') 을만나면 카운트가 안된다는 건 이해가 가는데 왜 버퍼에 있는것들이 비워지는건가요? 아니면 그 후에 나오는 print문을 만날 때  사라지는 건가요?

0

y  를 받음 => count 증가
\n 을 받음 => count 증가
순으로 일어납니다.

박병현님의 프로필 이미지
박병현

작성한 질문수

질문하기