Namespaces
Variants

asprintf, aswprintf, vasprintf, vaswprintf

From cppreference.net
헤더 파일에 정의됨 <stdio.h>
int asprintf ( char ** restrict strp, const char * restrict fmt, ... ) ;
(1) (동적 메모리 TR)
int aswprintf ( wchar_t ** restrict strp, const wchar_t * restrict fmt, ... ) ;
(2) (동적 메모리 TR)
int vasprintf ( char ** restrict strp, const char * restrict fmt,
va_list arg ) ;
(3) (동적 메모리 TR)
int vaswprintf ( wchar_t ** restrict strp, const wchar_t * restrict fmt,
va_list arg ) ;
(4) (동적 메모리 TR)
1) sprintf 의 유사 함수이지만, 출력과 종료 널 문자를 포함하여 충분히 큰 저장 공간을 malloc 호출을 통해 할당하고, 첫 번째 인자를 통해 해당 저장 공간에 대한 포인터를 반환합니다. 이 포인터는 더 이상 필요하지 않을 때 할당된 저장 공간을 해제하기 위해 free 에 전달되어야 합니다.
2) (1) 과 동일하지만, 와이드 문자 wchar_t 와 함께 동작합니다 ( swprintf 와 유사하게).
3) (1) 과 동일하며, 가변 인자 목록이 arg 로 대체됩니다. 이는 va_start 매크로(및 이후의 va_arg 호출 가능성)로 초기화되어야 합니다.
4) (3) 과 동일하지만, 와이드 문자 wchar_t 와 함께 동작합니다.

목차

매개변수

strp - 서식이 지정된 출력을 포함할 char * 또는 wchar_t * 포인터
fmt - printf / wprintf 및 관련 함수와 동일한 형식 문자열
arg - 추가 인자들은 vsprintf vswprintf 와 동일하게 사용됨

반환값

쓰여진 문자의 수는 각각 sprintf (1) , swprintf (2) , vsprintf (3) , 또는 vswprintf (4) 와 같습니다. 메모리 할당이 불가능하거나 다른 오류가 발생하면, 이 함수들은 - 1 을 반환하며, strp 의 내용은 정의되지 않습니다.

참고 사항

이 함수들은 GNU 확장 기능으로, C나 POSIX 표준에 포함되지 않습니다. *BSD에서도 사용할 수 있습니다. FreeBSD 구현에서는 오류 발생 시 strp NULL 로 설정합니다.

vasprintf vaswprintf 함수는 va_end 매크로를 호출하지 않습니다.

예제

clang(C11)으로 테스트할 수 있습니다

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void test(const char *fmt, ...)
{
    char* dyn_buf;
    printf("Demo asprintf:\n");
    const int written_1 = asprintf(&dyn_buf, "%s", fmt);
    printf("dyn_buf: \"%s\"; %i chars were written\n", dyn_buf, written_1);
    free(dyn_buf);
    printf("Demo vasprintf:\n");
    va_list args;
    va_start(args, fmt);
    const int written_2 = vasprintf(&dyn_buf, fmt, args);
    va_end(args);
    printf("dyn_buf: \"%s\"; %i chars were written\n", dyn_buf, written_2);
    free(dyn_buf);
}
int main(void)
{
    test("Testing... %d, %d, %d", 1, 2, 3);
}

출력:

Demo asprintf:
dyn_buf: "Testing... %d, %d, %d"; 21 chars were written
Demo vasprintf:
dyn_buf: "Testing... 1, 2, 3"; 18 chars were written