강의

멘토링

로드맵

Inflearn brand logo image

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

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

작성한 질문수

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

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

오류 이유가 궁금합니다

작성

·

307

1

int main()

{

int count = 0;

while (1)

{

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

if (getchar() == 'n')

break;

else if (getchar() == 'y')

count++;

else

printf("Please input y or n\n");

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

continue;

}

return 0;

}

 

강의에서 int c = getchat() 해서 c를 사용하니까 잘 되던데, if문이랑 else if문에 getchar()을 그대로 넣으면 왜 오류가 나는지 궁금합니다!

답변 1

1

안녕하세요, 답변 도우미 Soobak 입니다.

getchar() 함수는 호출될 때 마다 표준입력으로 입력된 문자 하나를 읽어옵니다.
따라서, ifelse if 문에서 getchar() 함수를 각각 호출하면, 두 번 입력을 받게 되는 것입니다.

작성하신 코드를 살펴보면, if (getchar() == 'n') 에서 n 을 입력하면 break; 가 실행되지만,
그렇지 않으면 다음 else if (getchar() == 'y') 에서 또 다시 입력을 기다립니다.

따라서, int c = getchar(); 와 같은 방식으로 변수에 입력을 한 번만 저장하여 여러 조건에서 사용하는 것이 일반적입니다.

예시 코드를 첨부드립니다.

#include <stdio.h>

int main()
{
    int count = 0;
    int c;

    while (1)
    {
        printf("Current count is %d. Continue?(y/n)\n", count);
        
        c = getchar(); // 한 번만 입력을 받음

        if (c == 'n')
            break;
        else if (c == 'y')
            count++;
        else
            printf("Please input y or n\n");

        while (getchar() != '\n') // 입력 버퍼 비우기
            continue;
    }

    return 0;
}

제가 해당 코드를 디버거 했는데 해당 코드를 실행 후 if, else if문에서 getchar()함수를 받아도 입력을 두 번 받는 것은 아니었습니다.

만약 a를 입력하면 if문에서 getchar()함수에서 발생한 버퍼 -> ['a','\n'] 중에 'a'가 소모가 됩니다.
이후에 else if문에서 '\n'을 처리해줍니다.

그로 인해 기존의 getchar()함수의 버퍼가 다 소모되면서 while문의 getchar()함수가 다시 입력을 받습니다. 그래서 입력을 두 번 받게 됩니다.

오히려 while문 없이 if, else if 구문만 두면 문자 하나만 입력하면 오류없이 실행되는 것처럼 보입니다. 물론 문자열을 입력하면 가장 바깥의 while문이 계속 돌면서 count가 많이 늘어났습니다.

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

작성한 질문수

질문하기