[C] printf 형식 지정자 설명과 활용

이번글은 printf 형식 지정자 사용법과 다양한 예제로 자세히 알아보겠습니다.

프로그래밍을 공부하면 변수나 제어문을 다루기 전에, 기본적인 입출력 방법을 알아야 합니다. 변수의 값이나 처리 결과를 확인하기 위해서는 화면에 출력하는 방법을 알아야 하는데, 이를 위해서 입력과 출력 명령을 먼저 익혀야 합니다.
이럴 때는 간단한 명령어를 사용해 확인하는 습관을 기르는 것이 중요합니다.

printf() 함수 이해하기

printf()는 C언어에서 표준 출력 함수로, C를 배우는 사람들이 많이 사용하는 명령어입니다. 이 함수의 철자를 주의깊게 봐야 하는데, ‘print’가 아닌 ‘printf’입니다. 이 함수는 Formatting의 약자인데, 서식화된 출력을 의미합니다. 처음에는 조립하는 것과 비슷하다고 생각해도 좋습니다. 기초적이면서도 복잡한 명령어 중 하나인데, 완벽하게 활용하기 위해서는 많은 경험이 필요합니다. 여기서는 기본적인 사용법에 초점을 맞추어 알아보겠습니다.

printf()의 기본 사용법

printf()는 괄호 안의 문자열을 화면으로 출력합니다. 가장 간단한 형태는 printf(“문자열 “);인데, 이 명령은 문자열을 그대로 화면에 출력합니다. 이 함수의 일반적인 사용법은 다음과 같습니다.

printf("서식문자열" [인수, 인수,...]);

서식 문자열을 화면으로 출력하는데, 문자열 내에 %로 시작되는 서식이 있으면 뒤쪽의 인수를 해당 서식에 맞게 출력합니다. 서식과 인수를 조합하여 화면에 원하는 내용을 출력할 수 있습니다. 서식이 없으면 인수를 생략할 수도 있습니다.

#include <stdio.h>

int main()
{
    int value = 10;
    char ch = 'H';

    printf("값은 %d이며 문자는 %c이다.\n", value , ch);
}

출력하면 다음과 같습니다.

값은 10이며 문자는 H이다.

서식 문자열 안에는 %d, %c 등의 서식이 포함됩니다. 이 서식에 대응되는 민수인 value와 ch가 서식 문자열 다음에 위치합니다. printf() 함수는 문자열 내의 서식을 실제 변수 값으로 바꿔 화면에 출력합니다.

%d 서식은 value에 대응되어 value 변수의 값인 10이 삽입되고, %c 서식은 ch에 대응되어 ch 변수의 값인 ‘H’가 삽입됩니다.

서식 문자열의 서식과 뒤의 인수는 순서대로 1:1로 대응됩니다. 서식과 인수의 개수가 같아야 하며 데이터 형식도 일치해야 합니다. %d는 정수형 서식이므로 정수형 변수와, %c는 문자형 서식이므로 문자형 변수와 대응되어야 합니다. 데이터 타입이 일치하지 않으면 프로그램이 올바르게 작동하지 않을 뿐만 아니라 때에 따라 에러를 발생시키고 다운될 수도 있습니다. 표준은 서식이 일치하지 않을 경우의 동작을 정의하지 않으므로 개발자가 꼭 일치시켜야 합니다.

서식은 % 뒤에 알파벳 문자 하나로 표기되며, %d, %c, %s, %f 등이 있습니다. 이 중 %d, %c, %s, %f 정도만 알고 있다면 변수값을 확인하는 데 충분히 활용할 수 있습니다. 필요할 때 나머지 서식은 다음 표를 참조 할 수 있습니다.

형식 지정자

printf 함수는 다양한 형식 지정자를 활용하여 출력을 다양하게 포맷화할 수 있습니다. 예를 들어, %d 형식 지정자를 사용하여 정수를 출력할 때, 해당 위치에 출력할 정수 변수를 지정합니다. 또한, 부동 소수점 숫자를 출력할 때에는 %f를 사용하며, 출력할 실수 변수를 지정합니다.

특수문자

형식 지정자 의미
\n 새 줄 (줄 바꿈 반환)
\t 탭 공간


정수형

형식 지정자 의미 예시 실행 결과
%d, %i 10진 정수 printf(“%d %i”,-20,12); -20 12
%u 양의 10진 정수 printf(“%u”,10); 10
%o 양의 8진 정수 printf(“%o”,10); 12
%x 양의 16진 정수(소문자) printf(“%x”,10); a
%X 양의 16진 정수(대문자) printf(“%X”,10); A
%lu unsigned long printf(“%lu”,100); 100
%ld signed long printf(“%ld”,1000); 1000
%llu unsigned long long printf(“%llu”,12345678912345); 12345678912345
%lld signed long long printf(“%lld”,-12345678912345); -12345678912345


실수형

형식 지정자 의미 예시 실행 결과
%f 실수의 소수점 표현(소문자,float) printf(“%f”,1,5); 1.5
%F 실수의 소수점 표현(대문자,float) printf(“%f”,1,5); 1.5
%e 실수의 지수 표현법(소문자,float) printf(“%e”,1,5); 1.50E+00
%E 실수의 지수 표현법(대문자,float) printf(“%E”,1,5); 1.50E+00
%g %f %e 중에서 짧은 (소문자) printf(“%g”,1,5); 1.5
%G %F %E 중에서 짧은 (대문자) printf(“%G”,1,5); 1.5
%a 실수를 16진법으로 표현(소문자) printf(“%a”,1,5); 0x1.8000000000000p+0
%A 실수를 16진법으로 표현(대문자) printf(“%A”,1,5); 0X1.8000000000000P+0
%lf 실수의 소수점 표현(소문자,double) printf(“%lf”,1,5); 1.5
%lF 실수의 소수점 표현(대문자,double) printf(“%lF”,1,5); 1.5
%le 실수의 지수 표현법(소문자,double) printf(“%le”,1,5); 1.50E+00
%lE 실수의 지수 표현법(대문자,double) printf(“%lE”,1,5); 1.50E+00


문자형

형식 지정자 의미 예시 실행 결과
%c 문자 printf(“%c”,’A’); A
%s 문자열 printf(“%s”,”Test String”); Test String


%와 문자사이 규칙

  • ‘-‘: 데이터의 왼쪽 정렬을 나타냅니다.
  • 숫자: 데이터의 최소 너비를 지정합니다. 데이터가 지정된 너비보다 더 많은 문자를 포함하고 있다면, 출력에 차지하는 공간도 더 커집니다. 데이터가 지정된 너비보다 적은 문자를 포함하고 있다면, 지정된 너비보다 작은 경우에는 우측 또는 좌측(음수 기호가 지정되지 않은 경우)으로 공백으로 채워집니다. 숫자 앞에 0이 붙어있으면 공백 대신에 0으로 채워집니다.
  • 점: 너비를 다음 숫자와 구분합니다.
  • 점 뒤에 따라오는 숫자: 숫자 데이터의 소수 자릿수(소수점 아래 자릿수) 또는 출력될 최대 문자 수를 지정합니다.
형식 지정자 예시 실행 결과
|%2d| printf(“|%2d|\n”, 9); | 9|
|%2d| printf(“|%2d|\n”, 123); |123|
|%03d| printf(“|%03d|\n”, 9); |009|
|%-2d| printf(“|%-2d|\n”, 7); |7 |
|%5.3d| printf(“|%5.3d|\n”, 2); | 002|
|%3.1d| printf(“|%3.1d|\n”, 15); | 15|
|%3.5d| printf(“|%3.5d|\n”, 15); |00015|
|%5s| printf(“|%5s|\n”, “Output sting”); |Output sting|
|%15s| printf(“|%15s|\n”, “Output sting”); | Output sting|
|%-15s| printf(“|%-15s|\n”, “Output sting”); |Output sting |
|%15.5s| printf(“|%15.5s|\n”,”Output sting”); | Outpu|
|%.5s| printf(“|%.5s|\n”, “Output sting”); |Outpu|
|%15.5s| printf(“|%15.5s|\n”,”Output sting”); | Outpu|
|%f| printf(“|%f|\n”, 87.65); |87.650000|


결론

C 를 개발할 때 printf, scanf 같은 형식 지정자를 사용하는 함수에서 무의식적으로 %d 만 사용 하는 경향이 있습니다.
이글을 보시고 정확히 알고 사용 하면 아주 간단한 버그도 쉽게 잡아 낼 수 있습니다.

Leave a Comment