본문 바로가기
프로그래밍/C

C ] vprintf, vsprintf, vsnprintf 차이

by eteo 2023. 2. 17.

 

int vprintf(const char * __restrict _format, va_list _ap);
int vsprintf(char * __restrict _string, const char * __restrict _format, va_list _ap);
int vsnprintf(char * __restrict _string, size_t _n, const char * __restrict _format, va_list _ap);

 

 

셋 다 마지막 매개변수로 가변인수 목록이 담긴 포인터를 받는다는 공통점이 있지만 vprintf는 콘솔로 출력하고 vsprintf와 vsnprintf는 버퍼로 출력한다는 차이점이 있다.

 

vsprintf와 vsnprintf의 차이점은 vsnprintf는 버퍼의 크기를 지정해서 좀 더 안전하게 쓸 수 있다는 차이점이 있다.

 

버퍼에 담았으면 uart나 usbcdc로 리다이렉션해서 출력하면 된다.

 

void printmsg(char *format,...)
{
    char str[128];
    int len;

    /*Extract the the argument list using VA apis */
    va_list args;
    va_start(args, format);
    len = vsprintf(str, format, args);
    SCI_writeCharArray(SCIA_BASE, (uint16_t *)str, strlen(str));
    va_end(args);
}

void printmsg(char *format, ...)
{
   char buf[128];
   int len;

   va_list args;
   va_start(args, format);
   len = vsnprintf(buf, 128, format, args);
   SCI_writeCharArray(SCIA_BASE, (uint16_t*)buf, len);
   va_end(args);
}

// ...

    for(;;)
    {
        printmsg("Hello World! %d\r\n", loopCnt++);
        DEVICE_DELAY_US(1000000);
    }