snprintf截断最后一个标志

时间:2011-06-12 13:23:48

标签: mysql c insert

请考虑以下代码:

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 个答案:

答案 0 :(得分:3)

snprintf返回:

  

打印的字符数(不包括用于结束输出到字符串的尾随'\ 0')

但是尺寸参数是:

  

和vsnprintf()最多写入大小字节(包括尾随空字节('\ 0'))

所以你应该:

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

答案 1 :(得分:0)

snprintf返回结果字符串的大小,不包括NULL终止符。我认为你需要将大小+ 1传递给第二个snprintf。

答案 2 :(得分:0)

其他人说了什么。但由于我的内容没有改变,所以简单地说:

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