【问题标题】:Append ' before and after char[] in C在C中的char []之前和之后附加'
【发布时间】:2020-05-17 10:04:24
【问题描述】:

我正在尝试在 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 *)"\'");
}

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

【问题讨论】:

    标签: c string segmentation-fault string-concatenation strcat


    【解决方案1】:

    数组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,"'");
    }
    

    【讨论】:

    • 问题不是附加的。仅写入const char []任何位置 都是未定义的行为。
    • 另外,strcpy() + strcat() 3 次迭代整个字符串总共 4 次,这并不是真正需要的。
    【解决方案2】:
    strcat(str,(const char *)"\'");
    strcat(str,key);
    strcat(str,(const char *)"\'");
    

    str 需要足够大以容纳整个连接的结果字符串,加上 \0 以终止字符串。在您的示例中,str 的声明并非如此:

    static const char str[] = "select * from name";
    

    使用str 仅保存旧字符串的大小加上\0。因此,尝试追加更多字符会导致分段错误。


    尝试以固定大小声明str,大到足以容纳结果字符串(select * from name + \' + 1234 + \' 的旧字符串 + 终止 \0 应为如果我没记错的话,总共 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,"'");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多