2011-06-12 2 views
0

다음 코드를 고려 마지막 기호 잘라 : 이제현재 snprintf는

char *myContent = "content"; 
int size = snprintf(NULL, 0, "INSERT INTO myTable (col1) VALUES('%s')",myContent); 
char *query = malloc(size+2); 
snprintf(query, size, "INSERT INTO myTable (col1) VALUES('%s')",myContent); 

을 나는 마지막 브라켓이 잘립니다 문제가 있습니다

(gdb) print query 
$2 = 0x616080 "INSERT INTO myTable (col1) VALUES('content'" 

이 유효한 SQL 문이 아닌를, 그래서 당신이 마지막 대괄호가없는 이유는 무엇일까요?

답변

3

snprintf 반환 :

그러나 크기 인수 ( 문자열로 출력을 종료하는 데 사용되는 후행 '\ 0'을 포함하지 않음) 인쇄 된 문자의 수는 다음과 같습니다

및 vsnprintf()는 최대 크기 바이트 ()를 사용하여 ('\ 0')) 널 바이트를 후행

따라서해야한다 :

char *query = malloc(size+1); 
snprintf(query, size+1, "INSERT INTO myTable (col1) VALUES('%s')",myContent); 
+0

ha .. 이미 char * query = malloc (size + 1); 하지만 snprintf 내에서 +1을 잊어 버렸습니다. 감사 – mkind

0

현재 snprintf은 NULL 종결을 포함하지 않는 결과 문자열의 크기를 반환합니다. 나는 두 번째 snprintf에 size + 1을 전달해야한다고 생각합니다.

0

다른 사람들이 뭐라고 말했는지. 그러나 myContent가 변경되지 않았으므로 다음과 같이 간단히 말하면 안전합니다.

관련 문제