C언어에서는 printf()를 사용하면 변수의 값을 손쉽게 출력할 수 있습니다. 하지만 이번 글에서는 putchar() 함수 하나만을 사용하여 long int 타입의 값을 출력하는 방법을 알아보겠습니다.
putchar()는 이름 그대로 단일 문자(character)만 출력할 수 있는 함수입니다. 따라서 숫자를 출력하려면 숫자를 한 자리씩 분리한 뒤, 각 자릿수를 문자로 변환하여 출력해야 합니다.
숫자를 문자로 변환하는 원리
핵심은 아스키(ASCII) 코드에 있습니다. 문자 '0'의 아스키 코드 값은 48이며, 숫자 0~9는 이 값으로부터 연속적으로 배치되어 있습니다. 그래서 숫자 값에 문자 '0'을 더해주면 해당 숫자의 아스키 문자 형태를 얻을 수 있습니다. 예를 들어 숫자 5에 '0'을 더하면 문자 '5'가 되는 것입니다.
각 자릿수를 추출하기 위해서는 나눗셈과 나머지 연산을 활용합니다. 10으로 나눈 몫을 재귀적으로 처리하면 가장 앞자리부터 출력할 수 있고, 10으로 나눈 나머지가 바로 현재 자릿수입니다.
예제 코드
#include <stdio.h>
void print_long(long value) {
if(value != 0) {
print_long(value / 10); // 더 높은 자릿수부터 먼저 처리
putchar((value % 10) + '0'); // 현재 자릿수를 문자로 변환해 출력
}
}
main(void) {
long a = 84571;
print_long(a);
}
실행 결과
84571
코드 동작 방식 설명
위 코드의 print_long() 함수는 재귀 호출 방식으로 동작합니다.
1. 먼저 값이 0이 아닌지 확인합니다.
2. 값을 10으로 나눈 몫을 인자로 하여 자기 자신을 다시 호출합니다. 이 과정이 반복되면 가장 높은 자릿수부터 차례대로 스택에 쌓입니다.
3. 재귀 호출이 끝나고 돌아오면서 각 단계에서 value % 10, 즉 마지막 자릿수에 '0'을 더해 문자로 만든 후 putchar()로 출력합니다.
예를 들어 84571이 입력되면, 재귀 호출이 8457 → 845 → 84 → 8 → 0 순으로 진행된 뒤, 돌아오는 과정에서 '8', '4', '5', '7', '1'이 순서대로 출력됩니다.
참고: 음수와 0 처리하기
위 기본 코드는 양수만 정상적으로 출력합니다. 실무 수준의 완성도를 높이려면 음수와 0도 고려해야 합니다.
#include <stdio.h>
void print_long(long value) {
if(value < 0) {
putchar('-'); // 음수 부호 출력
if(value == LONG_MIN) { // 최솟값 특수 처리
print_long(-(value / 10));
putchar('8');
return;
}
value = -value;
}
if(value != 0) {
print_long(value / 10);
putchar((value % 10) + '0');
}
}
main(void) {
long a = 84571;
print_long(a);
putchar('\n');
print_long(-123456789L);
putchar('\n');
if(a == 0) putchar('0'); // 0 처리
}
이처럼 putchar() 하나만으로도 재귀 호출과 아스키 코드 변환을 조합하면 long int 값을 충분히 출력할 수 있습니다. 임베디드 환경처럼 표준 라이브러리 사용이 제한적인 상황에서 유용하게 활용할 수 있는 기법입니다.