강의

멘토링

커뮤니티

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

Lucas님의 프로필 이미지
Lucas

작성한 질문수

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

6.18 루프 안에서 함수의 반환값 사용하기

scanf()를 여러 개 사용할 때 scanf()자체가 건너뛰기가 되는 현상 질문입니다.

작성

·

28

1

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int userInputBase = 0;
    int userInputExp = 0;
    int value = 0;
    char continueLoop = 'y';

    while (continueLoop == 'y')
    {
        printf("가수부를 입력하세요: ");
        scanf("%d", &userInputBase);
        printf("지수부를 입력하세요: ");
        scanf("%d", &userInputExp);
        value = 1;
        for (int i = 0; i <userInputExp; ++i)
        {
            value *= userInputBase;
        }
        printf("%d의 %d 제곱은 %d입니다\n", userInputBase, userInputExp, value);
        printf("다른 값을 계산하시겠습니까? (y/n) : ");
        scanf("%c", &continueLoop);
        printf("입력한 값은 %c 입니다.\n", continueLoop);
    }
    printf("종료 되었습니다. Good bye");
}

이렇게 작성했습니다.
scanf("%c", &continueLoop); 부분에서 n을 입력하면 while문을 빠져 나오게 의도 했는데, debuger를 살펴보니 continueLoop 변수에 10 '\n'이 저장이 된 채 해당 라인을 그냥 건너뛰더라고요. 그러고 나서 프로그램이 마지막 printf() 라인을 출력하고 종료 되었습니다.

마지막 scanf()를 건너뛰는 이유와 알 수 없는 값이 continueLoop 변수에 들어가 있는 이유가 궁금합니다.

답변 1

1

안녕하세요? 질문&답변 도우미 durams입니다.

해당 라인을 건너뛴 것이 아니라, 프로그램은 정확히 작성된 대로 동작했어요.

지금 혼란의 원인은 scanf 사용 시 버퍼에 입력된 개행 문자가 남아있어서 그렇습니다. 디버거에서 값이 10 '\n이라고 보이는 것은 '해당 char 타입 변수의 값은 10이며, '\n이라는 문자를 의미한다' 라는 뜻입니다.

개행 문자가 줄넘김을 의미한다는 것은 알고 계실거구요, char도 보통 문자를 의미하는 타입으로 많이 사용하지만, 실질적으로 컴퓨터 내부에서는 크기가 1바이트인 정수 값으로 취급된다는 것도 아마 들어보셨을겁니다. 디버거에서는 프로그래머가 잘 이해할 수 있도록 char의 경우 문자로도 보여준다고 보시면 될 것 같습니다.

가수부와 지수부를 입력할 때 엔터를 누르면 입출력에서 관리하는 버퍼라는 곳에 입력한 수와 같이 개행 문자도 들어가게 됩니다. 엔터를 치는것은 입력 함수에 개행 문자를 입력하는 행위이기도 합니다. 그 때문에 이후에 scanf("%c", &continueLoop);를 했을 때 버퍼에 남아있는 개행 문자를 읽게 되고 continueLoop 변수에는 10이라는 값이 들어가게 되는거죠.

입출력과 버퍼에 대해서는 섹션 9. 문자 입출력과 입력 유효성 검사 단원에서 다루며, 개행 문자를 처리하는 패턴에 대해서 간단하게 배우게 되니 일단은 현재 단원에서 다루는 내용에 집중하시고, 넘어가서 해당 내용에 대해 배우시면 될 것 같습니다.


당장 바로 scanf에 대한 이해만 갖고 적용할 수 있는 임시 방편으로는 아래와 같이 작성하시면 될 것 같네요.

 scanf(" %c", &continueLoop);

% 앞에 공백이 하나 추가되었는데요, scanf에서 공백은 (버퍼에 있는) whitespace 문자를 건너뛰는 효과가 있습니다.

Lucas님의 프로필 이미지
Lucas
질문자

아 엔터가 입력 완료가 아니라 개행문자를 남김으로써 scanf가 끝나는거였군요ㅠㅠ 정상 작동이라니 신선한 충격입니다

말씀해주신대로 일단 이건 기억만 해두고 넘어가서 9강에서 궁금증을 해소해 보겠습니다.

답변 감사합니다 🙇

Lucas님의 프로필 이미지
Lucas

작성한 질문수

질문하기