강의

멘토링

로드맵

Inflearn brand logo image

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

허지운님의 프로필 이미지
허지운

작성한 질문수

(C언어) scanf("%hhd %hhd", &A, &B);가 작동하지 않아요!

해결된 질문

작성

·

114

0

#include <stdio.h>

int main(void)
{
    char A, B;

    scanf("%hhd %hhd", &A, &B);

    printf("%d", (int)A + (int)B);

    return 0;
}

백준에서 1000번 문제인 A+B를 풀다가 A와 B의 조건이 0 < A, B < 10 인 것을 보고 char 자료형으로 최대한 메모리를 적게 쓰려 했습니다. 그런데 vs code로 한줄한줄 디버깅을 해보니 코드의 7번째 줄에서 A의 값으로 자꾸 0이 들어갔습니다. 자료형도 바꾸고(int) 다른 형식 지정자(%d)로 입력 받으니 제대로 작동했습니다.. 무엇이 문제인 걸까요??

또, 그 문제에 코드를 넣어 제출하니 맞았다고 나왔습니다. 분명 디버깅할 때에는 정상적으로 작동하지 않았어요. 제 컴퓨터 문제인 걸까요?

답변 1

1

안녕하세요, 인프런 AI 인턴입니다.

허지운님의 문제 상황을 잘 이해했습니다. scanf 함수에서 %hhd 형식 지정자를 사용했을 때 char 타입 변수에 값을 제대로 할당하지 못하는 문제가 발생했다는 것이죠.

이 문제는 컴파일러나 개발 환경에 따라 char 타입의 변수 처리 방식에 차이가 있을 수 있기 때문입니다. 보통 %hhd 지정자는 signed char 타입의 변수에 정수 값을 정확히 입력받기 위해 사용됩니다. 하지만 Visual Studio Code를 포함한 일부 환경에서는 이 형식 지정자의 처리 방식이 다르거나, 특정 버전의 C 표준 라이브러리 구현체에서 정상적으로 동작하지 않을 수 있습니다.

반면, 백준과 같은 온라인 채점 환경에서는 대부분의 문제가 GNU 컴파일러(GCC)를 사용하여 컴파일 되므로, 여기에서는 %hhd 형식 지정자가 의도대로 동작하여 정상적으로 입력을 받을 수 있습니다.

그리고 귀하의 코드가 정상적으로 작동하지 않는 것을 확인하는 과정에서 %d 형식 지정자로 변경했을 때는 문제 없이 동작한 이유는, %dint 타입의 정수를 입력받기 위한 형식 지정자이기 때문입니다. char 타입 변수에 %d를 사용하여 입력을 받으면, 입력받은 정수 값이 변수의 크기를 넘어서지 않는 한 대부분의 경우 정상적으로 변환될 수 있습니다.

따라서, 다양한 컴파일 환경에서 안정적으로 코드를 실행하고자 한다면, 값의 범위를 고려해 %d로 입력받고 int 타입 변수를 사용하거나, 코드를 작성할 때 컴파일러의 특성과 각 환경의 동작 방식을 고려하는 것이 좋습니다.

만약 메모리 사용량을 최소화하고자 한다면, 처음부터 char로 값을 입력받으려 시도하기보다는 입력받은 후 적절한 범위의 값으로 변환이 가능한지 확인하고 처리하는 방법을 고려해 볼 수 있겠습니다.

허지운님의 프로필 이미지
허지운

작성한 질문수

질문하기