2011-06-12 30 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 2011-06-12 13:43:37

0

的snprintf返回生成的字符串的長度,不包括空終止符。我認爲你需要將size + 1傳遞給第二個snprintf。

0

其他人說了些什麼。但作爲myContent沒有改變,可以簡單地說:

sprintf(query, "INSERT INTO myTable (col1) VALUES('%s')",myContent);