36. 문자열 생성
1. 키워드
- 버퍼(Buffer)
sprintf
2. 문자열 만들기
- 프로그램에서 문자열이 중요하게 사용되는 만큼 C에서는 다양한 문자열 처리 함수를 제공한다.
- 이번에는
printf
처럼 서식을 지정해서 문자열을 생성하는 방법을 알아보자.
3. 서식을 지정하여 배열 형태로 문자열 만들기
- 지금까지 사용한
printf
함수로는 문자열을 화면에만 출력할 수 있었다. stdio.h
헤더 파일에 선언되어 있는sprintf
함수를 사용하면 화면에 출력하지 않고 서식을 지정하여 문자열을 만들 수 있다.
#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
과 같이 문자열을 저장할 빈 배열을 버퍼라고 부른다.
- 서식 지정자를 사용할 수 있는 만큼 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
함수에 값을 바로 넣었지만 문자, 정수, 실수형 변수를 넣어도 된다.
입력한 값과 출력된 값이 다르다면?
- 문자
'a'
와 정수10
은 입력한 그대로 문자열로 만들어졌다. - 하지만
3.2f
는3.200000
으로 만들어졌다. - 이렇게 나오는 이유는 서식 지정자
%f
의 기본 설정이 소수점 아래6
자리까지 출력하도록 되어있기 때문이다.
4. 서식을 지정하여 문자열 포인터에 문자열 만들기
- 지금까지 배열 형태로 문자열을 만들었다.
- 이번에는 문자열 포인터에 문자열을 만들어보자.
- 문자열 포인터를 사용하려면 먼저
malloc
함수로 메모리를 할당한 뒤sprintf
함수로 문자열을 만들면 된다.
#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
함수로 동적 할당한 메모리를 해제한다.
- 문자열뿐만 아니라 서식 지정자를 사용하여 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
함수로 동적 할당한 메모리를 해제한다.