C 언어에서 형식 지정자(Format Specifier)는 입력과 출력을 위해 사용되는 특수 기호입니다. 이 개념을 활용하면 컴파일러가 scanf() 함수로 입력을 받거나 printf() 함수로 출력할 때 변수에 담긴 데이터가 어떤 자료형인지 정확히 판단할 수 있습니다.
주요 형식 지정자 목록
| 형식 지정자 | 자료형 / 용도 |
|---|---|
| %c | 문자(Character) |
| %d | 부호 있는 정수(Signed integer) |
| %e 또는 %E | 실수의 과학적 표기법 |
| %f | 실수(Float) 값 |
| %g 또는 %G | %e, %E와 유사한 실수 표기 |
| %hi | 부호 있는 short 정수 |
| %hu | 부호 없는 short 정수 |
| %i | 정수(%d와 동일하게 동작) |
| %l, %ld, %li | long 정수 |
| %lf | double 실수 |
| %Lf | long double 실수 |
| %lu | 부호 없는 int 또는 unsigned long |
| %lli 또는 %lld | long long 정수 |
| %llu | 부호 없는 long long 정수 |
| %o | 8진수 표현 |
| %p | 포인터 주소 |
| %s | 문자열(String) |
| %u | 부호 없는 정수(unsigned int) |
| %x 또는 %X | 16진수 표현 |
| %n | 아무것도 출력하지 않음 |
| %% | % 문자 자체를 출력 |
형식 지정자에 추가할 수 있는 옵션
위의 기본 형식 지정자 외에도 출력 형태를 세밀하게 조절하기 위해 다음과 같은 요소들을 추가로 조합할 수 있습니다.
마이너스 기호(-): 출력을 왼쪽으로 정렬합니다.
% 뒤의 숫자: 최소 필드 폭(field width)을 지정합니다. 문자열 길이가 지정한 폭보다 짧으면 남는 공간은 공백으로 채워집니다.
마침표(.): 필드 폭과 정밀도(precision)를 구분하는 데 사용됩니다.
예제 코드
#include <stdio.h>
main() {
char ch = 'B';
printf("%c\n", ch); // 문자 데이터 출력
// d와 i로 10진수(정수) 데이터 출력
int x = 45, y = 90;
printf("%d\n", x);
printf("%i\n", y);
float f = 12.67;
printf("%f\n", f); // 실수 값 출력
printf("%e\n", f); // 과학적 표기법으로 출력
int a = 67;
printf("%o\n", a); // 8진수 형식으로 출력
printf("%x\n", a); // 16진수 형식으로 출력
char str[] = "Hello World";
printf("%s\n", str);
printf("%20s\n", str); // 문자열을 포함해 총 20자리로 오른쪽 정렬
printf("%-20s\n", str); // 왼쪽 정렬
printf("%20.5s\n", str); // 총 20자리로 오른쪽 정렬하고 문자열은 5자리까지만 출력
printf("%-20.5s\n", str); // 왼쪽 정렬 후 문자열을 5자리까지만 출력
}실행 결과
B
45
90
12.670000
1.267000e+001
103
43
Hello World
Hello World
Hello World
Hello
Helloscanf()에서의 활용
이러한 형식 지정자는 printf()뿐만 아니라 scanf() 함수에서도 동일한 방식으로 사용할 수 있습니다. 즉, 위 예제에서 출력했던 것과 같은 방식으로 사용자로부터 입력값을 받아올 수 있습니다. 다만 scanf() 사용 시에는 변수 앞에 반드시 주소 연산자(&)를 붙여야 한다는 점을 기억하세요.