개발을 하거나 코딩 테스트를 할 때 가장 많이 하는 것은 아마 디버깅일 것이라고 생각됩니다. 한 번에 딱 원하는 코드를 작성하면 좋지만, 그렇지 않을 경우에 디버깅을 많이 하게 됩니다. 이럴 때 유용하게 사용되는 것이 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 |