43.2 서식을 지정하여 문자열 포인터에 문자열 만들기

지금까지 배열 형태로 문자열을 만들었습니다. 이번에는 문자열 포인터에 문자열을 만들어보겠습니다. 문자열 포인터를 사용하려면 먼저 malloc 함수로 메모리를 할당한 뒤 sprintf 함수로 문자열을 만들면 됩니다.

  • sprintf(문자열포인터, 서식, 값);
  • sprintf(문자열포인터, 서식, 값1, 값2, …);

다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요.

string_format_memory.c

#define _CRT_SECURE_NO_WARNINGS    // sprintf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>     // sprintf 함수가 선언된 헤더 파일
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일
    
int main()
{
    char *s1 = malloc(sizeof(char) * 20);  // char 20개 크기만큼 동적 메모리 할당

    sprintf(s1, "Hello, %s", "world!");    // "Hello, %s"로 서식을 지정하여 s1에 저장

    printf("%s\n", s1);    // Hello, world!: 문자열 s1 출력

    free(s1);    // 동적 메모리 해제

    return 0;
}

실행 결과

Hello, world!

char *s1 = malloc(sizeof(char) * 20);처럼 char 20개 크기만큼 동적으로 메모리를 할당했습니다. 그리고 sprintf 함수에 서식을 지정하여 문자열을 만들면 됩니다. 배열과 마찬가지로 s1과 같이 문자열을 생성할 메모리 공간도 버퍼입니다.

그림 43‑3 sprintf 함수를 사용하여 문자열 포인터에 문자열 만들기

문자열 사용이 끝났다면 반드시 free 함수로 동적 할당한 메모리를 해제합니다. 즉, 문자열 포인터 사용은 항상 malloc, 사용, free 패턴입니다.

그림 43‑4 문자열 포인터 사용 패턴

문자열뿐만 아니라 서식 지정자를 사용하여 C 언어의 다양한 값(자료형)도 문자열로 만들 수 있습니다. 이때도 마찬가지로 먼저 malloc 함수로 메모리를 할당합니다.

string_format_char_int_float_memory.c

#define _CRT_SECURE_NO_WARNINGS    // sprintf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>     // sprintf 함수가 선언된 헤더 파일
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

int main()
{
    char *s1 = malloc(sizeof(char) * 30);    // char 30개 크기만큼 동적 메모리 할당

    sprintf(s1, "%c %d %f %e", 'a', 10, 3.2f, 1.123456e-21f);    // 문자, 정수, 실수를 문자열로 만듦

    printf("%s\n", s1);    // a 10 3.200000 1.123456e-21: 문자열 s1 출력

    free(s1);    // 동적 메모리 해제

    return 0;
}

실행 결과

a 10 3.200000 1.123456e-21

먼저 char *s1 = malloc(sizeof(char) * 30);처럼 char 30개 크기만큼 동적으로 메모리를 할당합니다. 그리고 sprintf 함수에 서식을 지정하여 문자, 정수, 소수점 표기 실수, 지수 표기법 실수를 문자열로 만들면 됩니다.

문자열 사용이 끝났다면 반드시 free 함수로 동적 할당한 메모리를 해제합니다.

그림 43‑5 sprintf 함수를 사용하여 다양한 서식의 값을 문자열로 만들기