在 C 中的 char[] 之前和之后附加 '

Append ' before and after char[] in C

我正在尝试在 char 数组前后附加单引号。以下是我正在尝试的代码:

static const char str[] = "select * from name";
STATICF boolean test(){
   char[] key = "1234";
   strcat(str,(const char *)"\'");
   strcat(str,key);
   strcat(str,(const char *)"\'");
}

它不起作用,因为我遇到分段错误。我该如何解决这个问题?

数组 str 被初始化为与初始化它的字符串一样大。这意味着尝试向该字符串追加任何内容都会超出数组的末尾。这样做会调用 undefined behavior,在这种情况下会导致您的程序崩溃。

您需要使目标字符串足够大以容纳结果字符串,并且您不需要将其限定为 const

此外,手动构造 SQL 字符串不是一个好主意,因为它会导致 SQL 注入攻击。您应该改用准备好的语句,它可以安全地将参数注入命令。

static const char str[] = "select * from name";
STATICF boolean test(){
   char[] key = "1234";
   int len = strlen(str) + 1 + strlen(key) + 1 + 1;
   char dest[len];
   strcpy(dest,str);
   strcat(dest,"'");
   strcat(dest,key);
   strcat(dest,"'");
}
strcat(str,(const char *)"\'");
strcat(str,key);
strcat(str,(const char *)"\'");

str 需要足够大以容纳整个连接的结果字符串,加上 [=14=] 以终止字符串。在您的示例中,将 str 声明为:

时情况并非如此
static const char str[] = "select * from name";

str 仅保留旧字符串的大小加上 [=14=]。因此,尝试附加更多字符会导致分段错误。


尝试用固定大小声明str,大到足以容纳结果字符串(select * from name+\'+1234+[=的旧字符串20=] + 终止符 [=14=] 如果我没数错的话,总共应该是 25 个字符)。

str需要非常量顺便改变str的值,所以省略static const.

也省略了(const char *)的转换;并将 "\'" 替换为 "'".

结果如下:

char str[25];
strcpy(str,"select * from name");
STATICF boolean test(){
   char key[] = "1234";
   strcat(str,"'");
   strcat(str,key);
   strcat(str,"'");
}