2011-06-12 85 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);