C 언어에서 서식 문자열(format string) 은 printf, scanf 등의 함수에서 데이터를 특정 형식으로 출력하거나 입력받을 때 사용됩니다. 서식 문자열은 포맷 지정자(format specifier) 를 포함하며, 이를 통해 데이터를 원하는 형태로 변환할 수 있습니다.
1️⃣ 기본적인 포맷 지정자 (Format Specifiers)
포맷 지정자설명예제
%d | 부호 있는 10진 정수 (int) | printf("%d", 123); → 123 |
%i | %d와 동일 (int) | printf("%i", 123); → 123 |
%u | 부호 없는 10진 정수 (unsigned int) | printf("%u", 123); → 123 |
%x | 16진수 (소문자) | printf("%x", 255); → ff |
%X | 16진수 (대문자) | printf("%X", 255); → FF |
%o | 8진수 | printf("%o", 10); → 12 |
%f | 실수 (float, double) | printf("%f", 3.1415); → 3.141500 |
%e | 지수 표기법 (소문자 e) | printf("%e", 3.1415); → 3.141500e+00 |
%E | 지수 표기법 (대문자 E) | printf("%E", 3.1415); → 3.141500E+00 |
%c | 단일 문자 (char) | printf("%c", 'A'); → A |
%s | 문자열 (char 배열) | printf("%s", "Hello"); → Hello |
%p | 포인터 주소 (void*) | printf("%p", ptr); → 0x7ffdec1a5b78 |
%% | % 출력 | printf("%%"); → % |
🚨 주의: %d는 부호 있는 정수(signed int)이고, %u는 부호 없는 정수(unsigned int)입니다.
2️⃣ 가공된 출력 (출력 너비 및 정렬)
C 언어에서는 출력 형식을 좀 더 정교하게 조절할 수 있습니다.
✔ 출력 너비 (Minimum Width)
출력되는 값의 최소 너비를 설정할 수 있습니다.
printf("%10d\\n", 123);
➡ 123 (10칸 확보 후 오른쪽 정렬)
printf("%-10d\\n", 123);
➡ 123 (10칸 확보 후 왼쪽 정렬)
✔ 소수점 자리수 조절 (Precision)
실수 출력 시, 소수점 이하 자리수를 제한할 수 있습니다.
printf("%.2f\\n", 3.14159);
➡ 3.14 (소수점 이하 2자리 출력)
printf("%.5f\\n", 3.1);
➡ 3.10000 (소수점 이하 5자리까지 출력)
✔ 0 채우기 (Zero Padding)
숫자를 출력할 때 빈 자리를 0으로 채우는 것도 가능합니다.
printf("%05d\\n", 42);
➡ 00042 (5자리 확보, 빈 공간을 0으로 채움)
✔ 정렬 (Left / Right Justification)
- 기본적으로 숫자는 오른쪽 정렬됨.
-
- 기호를 사용하면 왼쪽 정렬됨.
printf("%10d\\n", 123); // 기본: 오른쪽 정렬
printf("%-10d\\n", 123); // 왼쪽 정렬
출력 결과:
123
123
3️⃣ 확장된 포맷 옵션
✔ 부호(+/-) 강제 표시
- %+d를 사용하면 양수라도 + 기호를 출력함.
- 기본적으로 음수는 -``로 표시됨.
printf("%+d %+d\\n", 10, -10);
➡ +10 -10
✔ 공백( ``)으로 양수 표시
양수인 경우 + 대신 공백을 추가할 수도 있음.
printf("% d\\n", 10);
printf("% d\\n", -10);
➡
10
-10
✔ 16진수, 8진수의 Prefix 출력
- %#x → 0x를 붙여 출력
- %#X → 0X를 붙여 출력
- %#o → 0을 붙여 출력
printf("%#x\\n", 255);
printf("%#o\\n", 10);
➡
0xff
012
4️⃣ 여러 개의 값 출력
포맷 지정자를 여러 개 사용할 수도 있습니다.
printf("Name: %s, Age: %d, Height: %.1fcm\\n", "Alice", 25, 167.5);
➡ Name: Alice, Age: 25, Height: 167.5cm
🚨 주의: printf의 포맷 지정자 개수와 인자의 개수가 일치해야 합니다.
잘못된 경우 예상치 못한 동작이 발생할 수 있음.
5️⃣ 잘못된 포맷 문자열의 문제점
C에서는 컴파일러가 printf의 포맷 문자열을 자동으로 검사하지 않습니다.
따라서 잘못된 형식을 사용하면 예측할 수 없는 오류가 발생할 수 있습니다.
int num = 42;
printf("%s\\n", num); // ⚠️ 정수를 문자열로 출력하려고 하면 오류 발생
➡ 잘못된 결과 또는 프로그램 충돌 발생 가능 (Segmentation fault 등)
해결 방법: 적절한 포맷 지정자를 사용해야 함.
printf("%d\\n", num); // 올바른 사용법
6️⃣ scanf에서의 서식 지정자
scanf를 사용할 때도 같은 포맷 지정자를 사용하지만, 주소 연산자(&)를 붙여야 함.
int age;
float height;
char name[20];
printf("Enter your name, age, and height: ");
scanf("%s %d %f", name, &age, &height);
printf("Hello %s, you are %d years old and %.1f cm tall.\\n", name, age, height);
🚨 주의:
- scanf("%s", name); → 문자열을 받을 때는 &를 붙이지 않음 (char 배열 자체가 주소이기 때문).
- scanf("%d", &age); → 정수는 &를 붙여야 함 (int 변수의 주소 전달).
- scanf("%f", &height); → 실수도 &를 붙여야 함.
7️⃣ 결론 (총 정리)
✅ C의 서식 문자열(format string)은 printf, scanf에서 데이터 출력을 조정하는 강력한 도구
✅ %d, %f, %s, %c 등의 포맷 지정자를 올바르게 사용해야 함
✅ 출력 너비, 정렬, 소수점 자리수, 부호 표시 등을 세부적으로 조정 가능
✅ 잘못된 포맷 지정자는 프로그램 충돌이나 예측할 수 없는 결과를 초래할 수 있음