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

이거덧글님의 프로필 이미지
이거덧글

작성한 질문수

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

8.1 입출력 버퍼

[02:47] getchar()

작성

·

310

0

int main()

{

int count = 0;

while (1)

{

printf("Current count is %d. Continue? (y/n) \n", count);

if (getchar() == 'n')

break;

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

continue;

count++;

}

}

저번 질문과 연결 됩니다.  제가 했던 질문에서

//초보때는 while(조건)에서 조건문도 실행이 된다는 점을 인식하지 못할 수도 있습니다.

getchar()가 반복해서 기능을 수행하게 된다는 점을 다시 한 번 생각해보세요.//

이렇게 답변을 주셔서 검색도 해보고 생각도 많이 해봤는데요.  getchar() 이 부분을 정확하게 이해하지 못 해서  전체적인 이해가 되지 않은 것 같습니다. 

순서도를 그리며 이해를 해봤습니다.

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

continue; 이 부분이 없다고 생각하면

1. printf 문 실행

2.if (getchar() == 'n') 에서 getchar() 로 입력값을 받음

만약 입력값이 abcdn이면 

3. a일때 count++

4.printf문 실행

5.count ++ getchar() 값은 b로 넘어감

... 이렇게 n까지 반복되고 n이모녀 count++ 하지 않고

n이니 종료가 됩니다.

그런데 여기서 

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

continue;  이 부분을 추가하게 되면

while에서 getchar() 부분은 if안에 있는 getchar()처럼

입력 값을 받는 것이 아니고 이미 받아진 입력 값을 검사 하는 것 인가요..?

getchar() 을 어떤 값을 입력 받는 다고 생각 하고 있어서 자꾸 저런 의문이 듭니다. continue를 하게 되면 계속 입력값을 받아야 하는데 (while에 getchar()이 있으니) 왜 검사만 하는 것일까 하고요. 

getchar() 강의에서 나중에 그림으로도 설명 해주신다고 했는데 지금은 대강 이해하고 넘어가는 것이 좋을까요?

답변 2

1

홍정모님의 프로필 이미지
홍정모
지식공유자

이번 강의가 '버퍼'에 대한 것이네요. 버퍼 얘기는 뒤에 몇 번 더 나오긴 합니다만, 이 내용은 여기서 이해를 하고 진행하시는 것이 좋겠습니다.

학생이 어떤 내용에서 막혔는지 추측하는 것이 쉬운 일은 아닙니다만, 이번 글에서 보기에는

입력 값을 받는 것이 아니고 이미 받아진 입력 값을 검사 하는 것 인가요..?

이것이 가장 중요한 부분인 것 같습니다.

사용자가 입력을 하면 그 내용이 버퍼에 계속 남아있습니다.

버퍼에 내용이 많이 남아 있다면 getchar()가 그 내용을 계속 읽어옵니다.

while(getchar()!='\n') continue;는 사용자로부터 새로 입력을 받는 것이 아니라 버퍼에 남아 있는 내용을 모두 지워버리는 기능이 됩니다. 뒤에도 자주 사용되기 때문에 이해하고 넘어가시는 것이 좋을 것 같습니다.

아직 이해되지 않은 부분이 있다면 다시 질문주세요.

0

이거덧글님의 프로필 이미지
이거덧글
질문자

아 그렇다면  getchar()는 꼭 getchar()으로 입력값을 받지 않아도 버퍼에 입력 값이 있으면 받아 오기 때문에

여기서

int main()

{

    char c;

    int rows, cols;

    while (1)

    {

        scanf("%c %d %d", &c, &rows, &cols);

        display(c, rows, cols);

        if (c == '\n')

            break;

    }

while (getchar() != '\n') continue; 를 추가하여 버퍼에 남아있는 엔터 값을 지워줄 수 있는 것인가요???

감사합니다 교수님!!

이거덧글님의 프로필 이미지
이거덧글

작성한 질문수

질문하기