Ch 03. 입출력 - 01. printf

2025. 3. 24. 22:39Programming Language/C++

반응형

printf는 c++이 아닌 c언어의 출력 방식이다.

이 printf에서 사용되는 형식 문자열이 여기저기서 많이 사용되고 알아두면 유용하기 때문에 조금 알아보고자 한다.

 

1. printf

printf의 첫번째 전달인자로 Format string(형식 문자열)이 사용된다.

최종 문자열의 형태는 Format specifier의 부분이 확정이 되어야 결정이 된다.

 

여기서 Format specifier란 형식 지정자로 %d, %o등 특수한 형태로 해당 서식의 형태를 결정해주는 요소이다.

 

printf에서 f는 이 형식 문자열을 사용하기에 붙은 것이다.

 

1-1. 사용해보기

C언어에서 printf는 stdio.h에 포함되어 있다.

그리고 이걸 include 할때 

#include <stdio.h>

와 같이 헤더파일을 include 해준다.

 

그러나 C++에서 C언어의 헤더파일을 추가해줄 때에는 동일한 방식이 아니라 .h를 제거한 후 맨 앞에 C를 붙여준 

#include <cstdio>

와 같이 사용하면 동일하게 헤더파일을 include한것과 같다고 보면된다.

 

이렇게 stdio를 include 해주고 기본적으로 printf를 한번 사용해보면 

#include <cstdio>

int main() 
{
	printf("%d", 55);
}

 

이렇게 출력이 된다.

추가로 문자열과 같이도 출력이 가능하다.

#include <cstdio>

int main() 
{
	printf("Hi, %d", 55);
}

보면 %d라는 문자가 그대로 출력 되는게 아니라 뒤에 두번째 전달인자로 돌아온 55가 %d로 들어가서 출력된것을 볼 수 있다.

이렇게 %d를 포함한 "Hi, %d"가 형식 문자열이 형식 문자열이며 %d형식 지정자라고 하는 것이다.

그리고 형식 문자열의 형식 지정자들은 뒤에 있는 전달인자에 의해서 값이 결정되게 된다.

 

그리고 이런 형식 지정자는 여러가지의 형태를 가지고 있기에 한번 살펴 보도록 하자.

 

1. 형식 지정자

형식 지정자의 기본 적인 구조는 아래와 같다.

%[플래그][필드너비][.정밀도][길이][형식문자]

 

1-1. 플래그

형식 출력의 세부 설정을 위한 옵션으로 데이터에 공백을 추가하거나 부호를 출력하는 등의 조작이 가능하다.

형식 설명 사용법 및 결과
- 왼쪽으로 정렬한다 %-5d  ->  5칸의 공간을 가진 채로 왼쪽 정렬한다
+ 항상 부호를 출력한다 " %+d ", 10  ->  +10
(공백) 양수일 경우 앞에 공백을 추가한다 " %  d ", 20  ->    10
0 빈칸을 0으로 채운다 " %05d ", 30  ->  00030
# 대체 형식을 사용한다: 0x, 0, 소수점 고정 등 "%#x", 42  -> 0x2a (원래 "%x", 42는 2a로 출력됨) 
"%#o", 42  -> 052  (원래 "%o", 42는 52로 출력됨)

 

1-2. 필드너비

최소 출력 문자의 수를 지정하고 출력하려는 문자가 수보다 부족하다면 공백 또는 0으로 채운다.

숫자 또는 *로 지정이 가능하고 *으로 지정하는 경우 인자로 필드의 너비를 받는다.

printf("%8d", 42);    // "      42"
printf("%*d", 8, 42); // 같은 결과

 

1-3. 정밀도

. 뒤에 정수를 넣어주는 것으로 지정이 가능하다.

타입에 따라 소수점 자릿수를 지정하는 것인지, 최대길이를 지정하는 것인지, 최소 자릿수를 지정하는 것인지 설정이 달라질 수 있다.

 

1-3-1) 부동 소수점(%f, %F)의 경우 : 소수점 자릿수를 지정

printf("%.0f", 3.141592); // 3
printf("%.2f", 3.141592); // 3.14
printf("%.5f", 3.141592); // 3.14159

// 부동 소수점 f 를 사용하면서 정밀도를 지정하지 않으면
// 기본값인 6자리의 소수점을 보여주게 된다.
printf("%f", 3.141592); // 3.141592

 

1-3-2) 문자열(%s)의 경우: 출력할 최대 문자수를 지정

printf("%.5s", "Hello, world"); //"Hello"
printf("%.8s", "Hello, world"); //"Hello, w"
printf("%.20s", "Hello, world");//"Hello, world"

 

1-3-3) 정수(%d, %i, %u, %x, %o)의 경우:최소 자리 수( 0으로 채움 )

*단, 0 플래그와는 다르게 정밀도는 무조건 숫자에만 적용된다, 부호는 포함되지 않는다

printf("%.5d", 42); // 00042
printf("%.3x", 42); // 02a
printf("%.4o", 42)  // 0052

// 부호가 있는 경우
printf("%.5d", -42) // -00042 - 자릿수에 부호는 포함되지 않음

 

추가로 %e, %E와 같은 지수 표기법에 대한 부분, %g, %G와 같이 일반 표기에 대한 부분이 있으나 추가적으로 나중에 필요할때 확인해보도록 하고 넘어가자.

 

1-4. 길이 지정자

데이터의 크기를 지정할 수 있는 접두어이다.

부호 의미 사용법
hh signed char 또는 unsigned char %hhd, %hhu
h short 또는 unsigned short %hd, %hu
l long 또는 unsigned long, wchar_t, long double %ld, %lu, %ls
ll long long 또는 unsigned long long  %lld, %llu
j intmax_t, uintmax_t %jd, %ji
z size_t %zd, %zu
t ptrdiff_t %td, %tu
L long double(부동소수점) %Lf

 

1-5. 형식 문자

형식 설명 예시 대응 타입
%d or %i 10 진수 정수 "%d", 42  →  42 int
%u 부호 없는 10진수(unsigned ~ 로 보임) "%u", 42  →  42 unsigned int
%o 8진수(Octet에서 기인한것으로 보임, 8을 의미함) "%o", 42  →  052 unsigned int
%x 16진수(소문자 - x 는 heXa, 16에서 기인한것으로 보임) "%x", 42  →  2a unsigned int
%X 16진수(대문자 - X는 동일하게 heXa에서 기인한듯 보임) "%X", 42 →  2A unsigned int
%f 고정 소수점(기본 소수점 6자리 실수) "%f", 3.141593  →  3.141593 float, double
%F %f와 같으나 무한대, NaN을 대문자로 출력함 "%F", 1.0 / 0.0   →  INF
"%F", 0.0 / 0.0   →  NAN
 
float, double
%e 지수 표기법(소문자 e) 3.14e+00 float, double
%E 지수 표기법(대문자 E) 3.14E+00 float, double
%g 자동 선택: %f 또는 %e 중 짧은 것 3.14 or 3.14e+00 float, double
%G %g와 같지만 E 사용    
%c 문자 하나 출력 "%c", 'A'  →  A int or char
%s 문자열 출력 "%s", "Hello"  →  Hello char *
%p 포인터 주소 출력 "%p", &x  →  ox1234abcd void *
%% 퍼센트 기호 출력 %%  → %  

 

printf는 기본적으로 stdio에 있기 때문에 스트림을 우리의 콘솔창과 연결하고 있다.

여기서 스트림의 방향을 파일로 옮겨주면 printf로 출력하는 정보를 파일에 저장하게도 할 수 있다.

 

반응형