[C언어] sprintf 함수: 배열 형태로 문자열 저장하기

Hyejin Kim·2023년 5월 3일
0

C언어

목록 보기
1/7
post-thumbnail

sprintf() 함수는 문자열을 생성하는 함수 중 하나입니다. sprintf() 함수는 printf() 함수와 유사하지만, 출력 대신 문자열을 버퍼에 저장합니다.

sprintf() 함수의 사용 방법

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

매개변수(인자)

char str = format을 복사해서 집어넣을 곳
const char
format = 서식지정자가 포함된 문자열

반환값(리턴값)

int = 성공한 문자의 개수
(실패 시 -1을 반환)

요약

printf() 함수가 화면에 출력한다면 sprintf()는 char* str에 복사 대입합니다.
배열의 크기를 넘어서면 buffer overflow가 발생할 수 있습니다.

설명

sprintf() 함수는 첫 번째 매개 변수로 문자열을 저장할 버퍼를 받습니다. 두 번째 매개 변수로는 출력할 문자열의 형식을 지정하는 서식 문자열을 받습니다. 이후에는 printf() 함수와 같이 서식 문자열에 맞게 출력할 값들을 전달합니다.

sprintf() 함수는 버퍼에 저장된 문자열의 길이를 반환합니다. 버퍼의 크기를 미리 지정해야 하며, 버퍼의 크기가 부족하면 문자열이 잘려서 저장됩니다. 이를 방지하기 위해서는 출력될 문자열의 길이를 미리 계산하여 충분한 크기의 버퍼를 할당해야 합니다.

코드 예시

#include <stdio.h>

int main() {
    char str[100];
    int a = 10, b = 20;
    sprintf(str, "a = %d, b = %d", a, b);
    printf("%s", str);
    return 0;
}

이 코드는 다음과 같은 출력을 생성합니다.

a = 10, b = 20

sprintf() 함수는 문자열을 생성하는 데 유용한 함수 중 하나이지만, 버퍼 오버플로우 등의 문제가 발생할 수 있으므로 주의해서 사용해야 합니다.

버퍼 오버플로우(overflow)

sprintf() 함수는 출력할 문자열을 저장하기 위해 미리 할당된 버퍼에 문자열을 쓰기 때문에 버퍼의 크기가 작으면 버퍼 오버플로우(overflow) 문제가 발생할 수 있습니다.

버퍼 오버플로우란, 버퍼의 크기를 초과하여 데이터가 쓰여지는 현상을 말합니다. 이러한 상황에서는 다른 메모리 영역을 덮어쓰는 등의 심각한 보안 문제를 일으킬 수 있습니다.

예를 들어, 다음 코드는 sprintf() 함수를 사용하여 문자열을 생성하고 버퍼에 저장하는데, 버퍼의 크기보다 큰 문자열을 생성하고 저장하려고 합니다.

#include <stdio.h>

int main() {
    char str[5];
    sprintf(str, "1234567890");
    printf("%s", str);
    return 0;
}

위 코드에서는 str 배열의 크기가 5로 지정되어 있지만, sprintf() 함수는 10자리의 문자열을 생성하려고 합니다. 이 경우, sprintf() 함수는 버퍼 오버플로우가 발생하여 예기치 않은 동작을 할 수 있습니다.

따라서, 버퍼 오버플로우 문제를 해결하기 위해서는 미리 충분한 크기의 버퍼를 할당하거나, 서식 문자열과 전달되는 인수의 크기를 미리 검사하여 버퍼 오버플로우를 방지해야 합니다. 또한, C언어에서는 보다 안전한 버전의 sprintf_s() 함수를 사용할 수도 있습니다. sprintf_s() 함수는 버퍼 크기를 매개 변수로 받아 버퍼 오버플로우를 방지할 수 있습니다.

profile
Hello. I am a developer who is still developing.

0개의 댓글