본문 바로가기
개발/C, C++

[C/C++] printf 함수의 모든 것

by 77monkey 개발자 2024. 5. 15.
반응형

 

 

 

개발을 하거나 코딩 테스트를 할 때 가장 많이 하는 것은 아마 디버깅일 것이라고 생각됩니다. 한 번에 딱 원하는 코드를 작성하면 좋지만, 그렇지 않을 경우에 디버깅을 많이 하게 됩니다. 이럴  때 유용하게 사용되는 것이 printf로 출력하는 것이라고 생각됩니다. 이번 포스팅에서는 printf 함수에 대해서 알아보려고 합니다. 

 

printf 함수

printf 함수는 아래와 같은 구조로 되어 있습니다. 

int printf(const char * format, ...);

 

printf 함수 형식 지정자

printf 함수의 형식 지정자는 아래처럼 구성되어 있습니다.

%[flags][width][.precision][length][specifier]

 

flags

왼쪽 정렬 등 출력 형태를 지정합니다.

flags description
- 지정된 필드 너비 내에서 왼쪽 정렬합니다.
예시) 
10진수 10일 경우, %-5d => 1 0 _ _ _  ( _ 는 공백을 의미함)
+ 지정된 필드 너비 내에서 오른쪽 정렬합니다. (기본값)
(공백) 값 앞에 공백이 삽입됩니다.
# 8진수, 16진수일 경우 진수표시가 됩니다.
예시)
10진수 16일 경우,
%#o => 020
%#x => 0x10
0 패딩이 지정된 경우 공백 대신 0으로 채웁니다.

 

width

출력 필드 폭을 지정하여 출력을 정렬합니다.

width description
(숫자) 출력할 최소 길이

 

precision

소수점 이하 자릿수 지정하여 부동 소수점 수를 출력합니다.

precision description
.(숫자) 부동 소수점 숫자를 출력할 때 소수점 이하 자릿수를 지정합니다.

 

length

데이터 형식의 길이를 지정하여 출력합니다. 보통 length에 들어가는 값들은 data type에 대한 값입니다.

예시로 %d인 경우를 작성했는데, d 대신에 u를 넣으실 수도 있고, 때에 따라서 필요한 형식지정자를 넣으실 수 있습니다.

length description
%d int
%hhd char
%hd short
%ld long
%lld long long
%z size_t

 

specifier

printf 함수의 지정 형식자는 출력할 데이터의 형식을 지정하는데 사용됩니다. 

specifier description
%d or %i 정수(int)를 출력할 때 사용됩니다.
%u 0 이상의 양의 정수(unsigned int)를 출력할 때 사용됩니다.
%f 부동 소수점 숫자(float, double)를 출력할 때 사용됩니다. 
%c 단일 문자(char)를 출력할 때 사용됩니다.
%s 문자열을 출력할 때 사용됩니다.
%p 포인터를 출력할 때 사용됩니다.

 

printf 함수 예시

printf 함수 같은 경우에는 사용자의 활용에 따라서 다양한 형태로 출력을 할 수 있습니다. 여기에서는 간단한 예시를 들려고 합니다. 필요에 따라서 위에서 언급한 내용들을 참고하여 사용하시면 도움이 될 것 같습니다. 

int main() {
	int num = 10;
	float fnum = 1.23;
	
	printf("@%-6x@\n", num);
	printf("@%0.4f@\n", fnum);

	return 0;
}

출력 결과는 다음과 같습니다. a 다음에 나오는 빈칸은 총 5개입니다. _(공백)으로 표현을 하려고 했는데, 더 헷갈리게 할 것 같아서 @를 두어서 헷갈리지 않도록 해보았습니다.

첫 번째 출력은 10이라는 10진수 숫자를 왼쪽 정렬하여 6자리에 맞춰서 출력을 하는 것입니다.

두 번째 출력은 1.23이라는 실수를 표현하는데, 빈 공간은 0으로 표현하고, 소수점 아래 자릿수를 4자리로 하여 출력을 하는 것입니다.

@a     @
@1.2300@

 

마무리

printf 함수에 대해서는 이 정도이면 충분할 것 같습니다. 디버깅을 할 때 주로 data type에 맞춰서 출력을 해줘야 하기 때문에 length와 specifier 부분을 많이 보실 것 같습니다. 저 같은 경우에는 unsigned long long int 같은 값을 출력하기 위해서 많이 검색했던 것 같습니다. 잘 정리하셔서 디버깅하는데 도움이 되셨으면 좋겠습니다.

반응형

'개발 > C, C++' 카테고리의 다른 글

[C/C++] call by value VS call by reference  (0) 2024.05.15
[C/C++] 포인터(Pointer) 개념  (0) 2024.05.13
[C/C++] inline 함수  (0) 2024.05.02
[C/C++] 함수(function)  (0) 2024.05.02
[C/C++] 연산자 우선순위  (0) 2023.09.18