C언어/stdio.h

[C언어] sprintf 함수 (stdio.h)

아무일도없었다 2022. 8. 7. 21:00

사용범위

Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수

기능

C언어 표준 함수로 format 으로 지정된 데이터를 string 형태로 변환하여 buffer 에 저장한다.

헤더

#include <stdio.h>

※ sprintf 함수 사용시 stdio.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※


함수

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

파라미터

  • char* str
    • format 을 통해 string 으로 변환된 문자열이 저장될 버퍼를 입력한다.
  • const char *format
    • 문자열 (string) 형태로 str에 저장할 string 문자의 서식을 입력한다.
    • 서식 지정자 참고
  • ...
    • C언어의 가변인자로 입력되는 파라미터의 개수를 동적일때 사용한다.
    • format에 들어가는 서식 문자 내용에 맞춰서 파라미터를 입력해야한다.

반환값

성공시  str 버퍼에 저장된 byte 수를 반환한다. (NULL 문자는 제외한다.)
실패시  음수를 반환한다.

잡학지식

sprintf 를 통해 buffer 저장된 string 데이터의 맨 마지막은 문자열의 마지막을 나타내는 NULL 문자가 추가된다.

따라서 안전한 sprintf 사용을 위해서는 format 을 통해 저장되는 데이터 보다 입력한 buffer 의 크기가  최소 1byte 커야한다. (NULL 공간)

또한 format 을 통해 입력되는 데이터의 최대 크기를 모르는 상황에서는 오버플로우 버그의 위험성이 있으니 사용하지 않는걸 권장한다.
(ex: %d 를 사용하는 int 의 경우 -1000000000 ~ -2147486648 범위에서는 최대 11byte 의 (음수 부호 포함) 데이터가 나오기 때문에 buffer 의 크기는 최소 12byte 이상이어야 한다.)

 

<소스 코드>

#include <stdio.h>

#define MAX_BUF_SIZE 128

int main() {
    char buffer[MAX_BUF_SIZE] = {0,};
    int num = 1234;
    char data[] = "Hello sprintf";
    int ret = 0;

    ret = sprintf(buffer, "%s (number[%d])", data, num);
    if(ret < 0) {
        // sprintf 실패
    } else {
        printf("[sprintf]ret = %d\n", ret);
        printf("buffer[%s]\n", buffer);
    }

    return 0;
}

 

※ 실행 결과

[sprintf]ret = 28
buffer[Hello sprintf (number[1234])]

 

반응형

'C언어 > stdio.h' 카테고리의 다른 글

[C언어] sscanf 함수 (stdio.h)  (0) 2022.08.09
[C언어] fprintf 함수 (stdio.h)  (0) 2022.08.07
[C언어] fflush 함수 (stdio.h)  (0) 2022.08.04
[C언어] fwrite 함수 (stdio.h)  (0) 2022.08.04
[C언어] fread 함수 (stdio.h)  (0) 2022.08.03