C 언어 sprintf 사용법 완벽 가이드

sprintf 함수는 C 언어에서 문자열에 형식을 지정하여 데이터를 저장할 때 사용됩니다. printf와 비슷하지만, 결과를 표준 출력 대신 문자열 버퍼에 저장하는 점이 다릅니다. 문자열 처리, 로깅, 버퍼 생성 등에 매우 유용합니다.


1. sprintf 함수 기본 문법

#include <stdio.h>

int sprintf(char *str, const char *format, ...);

매개변수 설명:

  • str: 결과 문자열을 저장할 버퍼의 포인터
  • format: 출력 형식을 지정하는 문자열
  • ...: 출력할 값들 (가변 인자)

반환 값:

  • 생성된 문자열의 길이 (널 종료 문자를 제외한 길이)

2. 기본 사용 예제

#include <stdio.h>

int main() {
    char buffer[50];
    int age = 25;
    float height = 175.5;

    sprintf(buffer, "나이: %d세, 키: %.1fcm", age, height);
    printf("%s\n", buffer);

    return 0;
}

출력 결과:

나이: 25세, 키: 175.5cm

3. 주요 서식 지정자(format specifier)

서식 지정자 설명 예제 출력

%d 정수 (10진수) 42
%f 실수 (부동소수점) 3.141593
%.2f 소수점 이하 2자리 3.14
%c 단일 문자 A
%s 문자열 Hello
%x / %X 16진수 (소문자/대문자) ff / FF
%% % 문자 출력 %

4. 고급 사용법

4.1. 다양한 데이터 형식 처리

char buffer[100];
int year = 2025;
char month[] = "February";
float temp = 23.7;

sprintf(buffer, "날짜: %s, 연도: %d, 온도: %.1f°C", month, year, temp);
printf("%s\n", buffer);

출력 결과:

날짜: February, 연도: 2025, 온도: 23.7°C

4.2. 너비(width)와 정렬

char buffer[100];
sprintf(buffer, "|%-10s|%10d|", "이름", 30);
printf("%s\n", buffer);

출력 결과:

|이름       |        30|

4.3. 여러 데이터의 결합

char buffer[100];
char firstName[] = "Alice";
char lastName[] = "Kim";

sprintf(buffer, "전체 이름: %s %s", firstName, lastName);
printf("%s\n", buffer);

출력 결과:

전체 이름: Alice Kim

5. sprintf 사용 시 주의할 점

  1. 버퍼 크기 초과 방지: sprintf는 버퍼 오버플로우를 방지할 수 없습니다. 더 안전한 대안으로 snprintf를 사용하는 것이 좋습니다.
  2. 널 종료 문자 처리: 함수는 자동으로 문자열 끝에 널 종료 문자를 추가합니다.
  3. 형식 지정자 일치: 형식 지정자와 전달된 데이터의 타입이 일치해야 합니다.

6. 실전 예제: 파일 경로 생성

#include <stdio.h>

int main() {
    char path[100];
    char directory[] = "/home/user";
    char filename[] = "data.txt";

    sprintf(path, "%s/%s", directory, filename);
    printf("파일 경로: %s\n", path);

    return 0;
}

출력 결과:

파일 경로: /home/user/data.txt

7. 결론

sprintf 함수는 형식을 지정하여 문자열을 생성할 때 매우 유용한 함수입니다. 다양한 데이터 형식을 하나의 문자열로 결합할 수 있으며, 안전한 메모리 처리를 위해 버퍼 크기를 신중히 고려하는 것이 중요합니다. sprintf를 적절히 사용하면 문자열 기반의 출력과 데이터 처리를 효과적으로 구현할 수 있습니다.