C의 형식 지정자

Muhammad Husnain 2023년10월12일
C의 형식 지정자

이 글은 C언어의 printf 함수와 이 함수에서 사용되는 서식 지정자에 대한 내용입니다. 이 기사에서는 형식 지정자의 구문과 다양한 데이터 유형에 사용되는 방법에 대해 자세히 설명합니다.

먼저 printf 함수의 구문을 살펴보겠습니다.

C에서 printf() 함수의 형식 지정자

printf() 함수의 구문은 다음과 같습니다.

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

이 함수는 표준 출력 콘솔의 format 변수에 저장된 문자열을 씁니다. 이 문자열에 형식 지정자, 즉 일부 변수를 지정하기 위해 % 기호로 시작하는 일부 하위 문자열이 포함되어 있으면 문자열 뒤에 지정된 값으로 대체됩니다.

매개변수:

  • format

출력에 쓰여질 텍스트는 이 C 문자열에 저장됩니다. 선택적으로 포함된 형식 지정자를 포함할 수 있으며, 다음 추가 인수에 제공된 값으로 대체되고 필요에 따라 형식이 지정됩니다.

형식 지정자는 다음 패턴을 따릅니다.

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

대괄호 []는 이러한 지정자가 선택 사항임을 나타냅니다. 예를 들어 printf("%lu",4294967295)는 부호 없는 긴 형식으로 4294967295를 인쇄한다는 의미입니다.

여기서 llong int에 대한 길이 지정자이고 uunsigned 숫자에 대한 지정자입니다. 나머지 선택적 인수는 무시됩니다.

이 패턴의 끝에 있는 지정자는 인쇄할 데이터 유형을 정의하므로 가장 중요한 부분입니다. 다양한 지정자 목록과 해당 설명은 아래 표에 나와 있습니다.

지정자 설명
d 또는 i 부호 있는 10진 정수
u 부호 없는 10진 정수
o 부호 없는 8진수
x 부호 없는 16진수
X 부호 없는 16진수 대문자
f 소문자의 10진수 부동 소수점
F 대문자로 된 10진수 부동 소수점
c 성격
s
a 소문자의 16진수 부동 소수점
A 대문자로 된 16진수 부동 소수점
p 포인터 주소

지정자 앞의 나머지 하위 지정자는 모두 선택 사항이지만 용도는 아래에 정의되어 있습니다.

플래그:

플래그 설명
- 필드를 왼쪽 정렬하기 위해.
+ 양수 앞에 강제로 더하기 기호를 배치합니다.
# 각각 0, 0x 또는 0X를 배치하기 위한 8진수 및 16진수 지정자(o,x,X)에 사용됩니다.
0 값 왼쪽에 0을 추가합니다.

너비:

너비 설명
(number) 인쇄할 최소 문자 수를 지정합니다.
* 너비는 형식 문자열이 아닌 형식화할 인수 앞에 오는 추가 정수 값 인수로 제공됩니다.

정도:

정도 설명
.number 인쇄할 최소 자릿수를 지정합니다. 숫자의 자릿수가 적으면 왼쪽에 0이 채워집니다.
.* 정밀도는 형식 문자열이 아닌 형식화할 인수 앞에 추가 정수 값 인수로 제공됩니다.

길이:

길이 설명
hh 정수 유형에 대해 char에서 승격된 int 크기의 정수 인수를 가정하도록 printf를 지정합니다.
h 정수 유형에 대한 short에서 승격된 int 크기의 정수 인수를 가정하도록 printf를 지정합니다.
l 정수 유형에 대해 긴 크기의 정수 인수를 가정하도록 printf를 지정합니다. 부동 소수점 유형의 경우 무시됩니다. varargs를 사용할 때 float 인수는 자동으로 double로 승격됩니다.
ll 정수 유형에 대해 길고 큰 정수 인수를 가정하도록 printf를 지정합니다.
L 부동 소수점 유형에 대한 long double 인수를 가정하도록 printf를 지정합니다.
z 정수 유형의 경우 printf를 지정하여 size_t 크기의 정수 인수를 가정합니다.
j 정수 유형의 경우 intmax_t 크기의 정수 인수를 가정하도록 printf를 지정합니다.
t 정수 유형의 경우 ptrdiff_t 크기의 정수 인수를 가정하도록 printf를 지정합니다.
  • ...

함수는 형식 문자열(또는 n의 경우 저장 위치에 대한 포인터)에 따라 형식 문자열의 형식 지정자를 대체할 값을 각각 보유하는 일련의 추가 인수를 기대할 수 있습니다.

이러한 매개변수의 수는 최소한 형식 지정자에 표시된 값의 수와 같아야 합니다. 이 함수는 추가 인수를 무시합니다.

반환 값:

작업이 성공하면 쓰여진 총 문자 수를 반환합니다. 오류 표시(ferror)가 설정되고 쓰기 오류가 발생하면 음의 정수가 반환됩니다.

ErrnoEILSEQ로 설정되며, 와이드 문자 쓰기 중 멀티바이트 문자 인코딩 오류가 발생하면 음의 정수가 제공됩니다.

예:

#include <stdio.h>

int main() {
  printf("Some Character values: %c %c \n", 'b', 66);
  printf("Some Decimal Value: %d %ld\n", 1234, 670000L);
  printf("Numbers preceeding with blank spaces: %10d \n", 1234);
  printf("Numbers preceeding with zeros: %010d \n", 1235);
  printf("Different number systems: %d %x %o %#x %#o \n", 100, 100, 100, 100,
         100);
  return 0;
}

출력:

Some Character values: b B
Some Decimal Value: 1234 670000
Numbers preceeding with blank spaces:       1234
Numbers preceeding with zeros: 0000001235
Different number systems: 100 64 144 0x64 0144
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn