해결된 질문
작성
·
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
형식 지정자로 변경했을 때는 문제 없이 동작한 이유는, %d
가 int
타입의 정수를 입력받기 위한 형식 지정자이기 때문입니다. char
타입 변수에 %d
를 사용하여 입력을 받으면, 입력받은 정수 값이 변수의 크기를 넘어서지 않는 한 대부분의 경우 정상적으로 변환될 수 있습니다.
따라서, 다양한 컴파일 환경에서 안정적으로 코드를 실행하고자 한다면, 값의 범위를 고려해 %d
로 입력받고 int 타입 변수를 사용하거나, 코드를 작성할 때 컴파일러의 특성과 각 환경의 동작 방식을 고려하는 것이 좋습니다.
만약 메모리 사용량을 최소화하고자 한다면, 처음부터 char
로 값을 입력받으려 시도하기보다는 입력받은 후 적절한 범위의 값으로 변환이 가능한지 확인하고 처리하는 방법을 고려해 볼 수 있겠습니다.