반응형
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;
}
반응형
'C언어 응용 > 활용' 카테고리의 다른 글
BASE64 encoding/decoding 구현 (0) | 2023.12.13 |
---|---|
getch( ), getche( ) 대체 함수 구현 (LINUX용) (0) | 2019.11.03 |
strncat(3) - 대체 함수 구현 (0) | 2019.10.04 |
strcat(3) - 대체 함수 구현 (0) | 2019.10.04 |
log 생성 API 구현 (0) | 2019.10.04 |