snprintf_concat( )

int snprintf_concat(char *dest, size_t buf_size, const char *format, ... )

snprintf(3)는 문자열을 formatting하는 목적으로 많이 사용됩니다. UNIX 또는 LINUX의 종류에 따라서 구현된 내용이 다릅니다.  아래와 같이 dest가 저장 buf와 input 데이터로 두군데 사용할 경우에 OS마다 다른 결과가 나옵니다.

 char dest[1024]; 
 char column[3] = "02";

 ......

 strcpy(dest, "SELECT * FROM TABLE WHERE 1 = 1 ");

 if(strlen(column) != 0) {
     snprintf(dest, 1024, "%s AND col1 = '%s'", dest, column);
 }

 printf("SQL = [%s]\n");

 HP UNIX에서는 dest 변수에 추가적인 format된 문자열을 추가하는 로직으로 동작합니다.

 결과:

 SQL = [SELECT * FROM TABLE WHERE 1 = 1 AND col1 = '02']

 

 LINUX에서는 dest를 항상 초기화하여 두개의 dest가 같은 변수라 데이터가 삭제됩니다.

 결과:

 SQL = [ AND col1 = '02']

 

 위와 같이 HP UNIX에서의 snprintf와 같은 기능은 대량 배치를 작성하는 Pro*C에서 조건에 따라 SQL문을 조립하는 용도로 많이 사용됩니다.  그러므로 LINUX에서는 구현이 달라서 이런 기능이 필요한 경우 공통 함수를 만들 필요가 있습니다.

 


Source 구현

 

int snprintf_concat(char *dest, size_t buf_size, const char *format, ... )
{
    int ret;
    char tmp_buf[buf_size];

    va_list args;
    va_start(args, format);

    ret = vsnprintf(tmp_buf, buf_size, format, args);

    va_end(args);

    strcpy(dest, tmp_buf);

    return ret;
}

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

Tag , , ,

댓글을 달아 주세요