C 中经常需要这样生成 sql 语句:
sprintf(sql, "INSERT INTO data(cmd) VALUES(\"%s\");", cmd);
当 cmd 为 echo "ab 时,
C 中 cmd 为 "echo \"ab"
sql 为 "INSERT INTO data(cmd) VALUES(\"echo \"ab\");"
会在 ab 前面发生截断.
cmd 的内容需要转义,将 ' 转义为 '' (两个单引号), " 转移为 ""(两个双引号).
以下为实现
/*
* author: dengzhaoqun
* date: 2012/10/23
*/
char *xm_escape_string(const char *str)
{
char *bak;
int len;
int i;
int j;
len = strlen(str);
bak = (char *)malloc((len * 2 + 1) * sizeof(char));
if(bak == NULL)
{
fprintf(stderr, "malloc failed\n");
return NULL;
}
memset(bak, 0, len * 2 + 1);
j = 0;
for(i=0; i<len; i++)
{
if((str[i] == '"') || (str[i] == '\''))
{
bak[j] = str[i];
j++;
}
bak[j] = str[i];
j++;
}
return bak;
}
我曾尝试将 cmd 中 \ 转义为 \\ , " 转义为 \", ' 转义 为 \", 但结果提示 sqlite 不能解析.
参考: http://blog.youkuaiyun.com/ameyume/article/details/8007149