Skip to content

36. 문자열 생성


1. 키워드

  • 버퍼(Buffer)
  • sprintf


2. 문자열 만들기

  • 프로그램에서 문자열이 중요하게 사용되는 만큼 C에서는 다양한 문자열 처리 함수를 제공한다.
  • 이번에는 printf처럼 서식을 지정해서 문자열을 생성하는 방법을 알아보자.


3. 서식을 지정하여 배열 형태로 문자열 만들기

  • 지금까지 사용한 printf 함수로는 문자열을 화면에만 출력할 수 있었다.
  • stdio.h 헤더 파일에 선언되어 있는 sprintf 함수를 사용하면 화면에 출력하지 않고 서식을 지정하여 문자열을 만들 수 있다.


sprintf(배열, 서식, );
sprintf(배열, 서식, 값1, , ...);
성공하면 만든 문자열의 길이를 반환, 실패하면 음수를 반환
#define _CRT_SECURE_NO_WARNINGS // sprintf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>              // sprintf 함수가 선언된 헤더 파일

int main()
{
    char s1[20]; // 크기가 20인 char 타입 배열을 선언

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

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

    return 0;
}

// Hello, world!


  • sprintf(s1, "Hello, %s", "world!");처럼 sprintf 함수에 문자열을 저장할 배열과 문자열을 만들 서식 그리고 문자열을 만들 값(문자열)을 순서대로 넣는다.
  • 이렇게 하면 "Hello, %s"에서 서식 지정자 %s 부분이 "world!"로 바뀌면서 s1"Hello, world!"가 저장된다.
  • 보통 s1과 같이 문자열을 저장할 빈 배열을 버퍼라고 부른다.


001


  • 서식 지정자를 사용할 수 있는 만큼 C의 다양한 값(자료형)도 문자열로 만들 수 있다.


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

int main()
{
    char s1[30]; // 크기가 30인 char 타입 배열을 선언

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

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

    return 0;
}

// a 10 3.200000 1.123456e-21


  • sprintf(s1, "%c %d %f %e", 'a', 10, 3.2f, 1.123456e-21f);와 같이 sprintf 함수에 서식으로 "%c %d %f %e"를 지정했다.
  • 그리고 각 서식 지정자에 맞게 문자 'a', 정수 10, 소수점 표기 실수 3.2f, 지수 표기법 실수 1.123456e-21f를 넣어줬다.
  • 이렇게 하면 지정된 서식에 맞춰 값을 문자열을 만들 수 있다.
  • 여기서는 sprintf 함수에 값을 바로 넣었지만 문자, 정수, 실수형 변수를 넣어도 된다.


002


입력한 값과 출력된 값이 다르다면?

  • 문자 'a'와 정수 10은 입력한 그대로 문자열로 만들어졌다.
  • 하지만 3.2f3.200000으로 만들어졌다.
  • 이렇게 나오는 이유는 서식 지정자 %f의 기본 설정이 소수점 아래 6자리까지 출력하도록 되어있기 때문이다.


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

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


sprintf(문자열포인터, 서식, );
sprintf(문자열포인터, 서식, 값1, , ...);
#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); // 문자열 s1 출력

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

    return 0;
}

// Hello, world!


  • char *s1 = malloc(sizeof(char) * 20);처럼 char 타입 20개 크기만큼 동적으로 메모리를 할당했다.
  • 그리고 sprintf 함수에 서식을 지정하여 문자열을 만들면 된다.
  • 배열과 마찬가지로 s1과 같이 문자열을 생성할 메모리 공간도 버퍼이다.
  • 문자열 사용이 끝났다면 반드시 free 함수로 동적 할당한 메모리를 해제한다.


003


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


#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); // 문자열 s1 출력

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

    return 0;
}

// a 10 3.200000 1.123456e-21


  • 먼저 char *s1 = malloc(sizeof(char) * 30);처럼 char 타입 30개 크기만큼 동적으로 메모리를 할당한다.
  • 그리고 sprintf 함수에 서식을 지정하여 문자, 정수, 소수점 표기 실수, 지수 표기법 실수를 문자열로 만들면 된다.
  • 문자열 사용이 끝났다면 반드시 free 함수로 동적 할당한 메모리를 해제한다.


004


References