C에서 %i라는게 있다고?
생각보다 많은 사람들이 C라는 언어에 %i라는 서식 지정자가 있는 것을 모른다. 왜 그런지 모르겠지만, 보통 %d만 사용하다 보니 이 둘의 차이에 대해 얘기할 기회가 별로 없었나 보다. 아무튼 오늘은 %d와 %i의 존재 이유와 그 차이를 한 번 파헤쳐보자.
printf에서의 %d와 %i
우선 출력 함수인 printf를 보면, %d와 %i는 사실상 똑같이 동작한다.
둘 다 정수를 10진수로 출력하는 역할을 한다. 간단한 예제로 확인해보자.
#include <stdio.h>
int main() {
int num = 42;
printf("%%d를 사용하면: %d\n", num);
printf("%%i를 사용하면: %i\n", num);
return 0;
}
위 코드를 실행하면 42가 두 번 똑같이 출력된다. 출력에서는 %d와 %i의 차이를 찾기 어렵다.
scanf에서의 %d와 %i
문제는 주로 입력 함수인 scanf에서 시작된다. 이때 두 서식 지정자는 아래와 같이 다르게 동작한다.
%d
입력한 값을 무조건 10진수로 해석한다.
예를 들어, “0x2A” 같은 값을 입력하면 제대로 인식하지 못할 수도 있다.%i
입력한 값의 접두사를 보고 진법을 자동으로 결정한다.- 값이
0x나0X로 시작하면 16진수로, 0으로 시작하면 8진수로,- 그 외에는 10진수로 해석한다.
- 값이
좀 더 자세한 예제를 보자.
#include <stdio.h>
int main() {
int num_d, num_i;
// %d를 사용한 입력: 무조건 10진수로 해석
printf("10진수 정수를 입력하세요: ");
scanf("%d", &num_d);
printf("입력된 값 (%%d 사용): %d\n", num_d);
// %i를 사용한 입력: 접두사에 따라 진법이 달라짐
printf("정수를 입력하세요 (0x, 0으로 시작하면 해당 진법으로 인식): ");
scanf("%i", &num_i);
printf("입력된 값 (%%i 사용): %d\n", num_i);
return 0;
}
예를 들어, 만약 %i를 사용하여 “0x2A”를 입력하면,
16진수 2A가 10진수 42로 해석된다.
반면 %d는 그런 접두사를 인식하지 않기 때문에, 입력값이 올바르게 해석되지 않을 가능성이 있다.
언제 어떤 서식 지정자를 써야 할까?
출력할 때 (printf):
%d와%i는 똑같이 동작하므로, 특별한 이유가 없다면 어느 것을 사용해도 무방하다.입력할 때 (scanf):
만약 입력값이 반드시 10진수여야 한다면%d를 사용하는 것이 좋다.
반면, 여러 진법의 숫자를 입력받아야 하는 상황이라면%i를 선택하면 편리하다.
정리
결국 C 언어에서 %i라는 서식 지정자가 존재하는 이유는 입력 함수 scanf에서 다양한 진법의 숫자를 자동으로 처리해주기 때문이다.
출력에서는 둘의 차이가 없으니, 사용 목적에 맞게 선택하면 된다.
이 글을 통해 C 언어의 서식 지정자 %d와 %i의 차이를 이해하고, 상황에 따라 올바른 선택을 할 수 있게 되길 바란다.
코딩할 때 이런 사소한 차이가 나중에 큰 도움이 될 때가 있으니 기억해두자!
