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 등의 포맷 지정자를 올바르게 사용해야 함

 출력 너비, 정렬, 소수점 자리수, 부호 표시 등을 세부적으로 조정 가능

 잘못된 포맷 지정자는 프로그램 충돌이나 예측할 수 없는 결과를 초래할 수 있음

블로그 이미지

RIsN

,