代码之家  ›  专栏  ›  技术社区  ›  user3813942

C-从char[]创建const char*

  •  -1
  • user3813942  · 技术社区  · 6 年前

    这看起来很简单,但我是C新手,在网上找不到任何人问这个问题。我有一个 char[] 我设定的 sprintf . 然后我要做一个 const char* 从那开始 字符[] . 这可能吗?还是我需要和我的类型玩?我需要一个 常量字符* 要进入MySQL查询,但我需要 字符[] 因为我需要用 把格式数据写成串 在结果中插入变量值。下面是代码片段:

    char sqlbuff[4096];
    const char* sqlquery;
    sprintf(sqlbuff, " %s %s ",
            "SELECT idnum FROM idTbl WHERE idCol =", idVar);
    
    sqlquery = &sqlbuff;
    
    if ( mysql_query(con, sqlquery) ) 
    {
        finish_with_error(con);
    }
    

    我试过设置 const char 变量有很多种,但我总是得到一个错误。如果我硬编码一个值 idVar 然后就跑

    mysql_query(con, "SELECT idnum FROM idTbl WHERE idCol = 1300)
    

    它工作得很好。问题是我需要用 把格式数据写成串 利用变量。感谢大家的帮助。

    编辑:运行于 HP-UX 11.11版

    2 回复  |  直到 6 年前
        1
  •  2
  •   John Bollinger    6 年前

    我要做一个 const char* 从那开始 char[]

    从您的代码示例来看,您的意思是希望 const char * 指的是 字符[] . 这非常简单:

    sqlquery = sqlbuff;
    

    这是因为数组类型的值在几乎所有表达式上下文中都会自动转换为指针,并且允许为non赋值- const 输入对应的变量 常量 -合格类型。

    此外,对于显示的内容,甚至不需要变量。您只需将数组的标识符指定为 mysql_query . 同样的从数组到指针的自动转换也适用于这里,您可以合理地解释 常量 第二个参数类型中的限定符,作为该函数不会尝试修改指向的数据的保证

    mysql_query(con, sqlbuf);
    

    另一方面,你的尝试,

    sqlquery = &sqlbuff;  // wrong
    

    ,生成错误类型的指针。 &sqlbuf 是一个指针 到一个数组 ,鉴于 sqlquery 被声明为指针 到一个字符 . 指向第一个的指针 char 一个 字符[] 将指向与指向整个数组的指针相同的位置,但这两种类型不同。

        2
  •  3
  •   user2371524user2371524    6 年前

    这一行错了:

    sqlquery = &sqlbuff;
    

    sqlbuff 具有类型 char [] ,所以取下它的地址 对于数组指针 ,类型 char (*)[] . 你只要一个指针指向第一个 char (类型 char * ),并且在大多数上下文中,对数组标识符求值会产生这样的指针(有一些异常,如与 sizeof ). 所以,就写吧

    sqlquery = sqlbuff;
    

    也就是说,根本不需要单独的指针变量。 sqlbuff公司 评估为 字符* ,指针可以转换为 const -隐式限定对应项。就这样过去 sqlbuff公司 直接在 const char * 是预期的,而且会奏效。


    还有一件事应该提及,尽管与你的问题没有直接关系:你应该 从不使用字符串操作从用户输入构造SQL查询 . 攻击者可以通过这种方式轻松地注入自己的SQL代码。阅读SQL客户端库的文档并查找 准备好的陈述 参数绑定 在用户输入需要作为SQL查询参数的任何地方都可以使用这个函数。


    还有一个提示:如果你发现自己写的代码

    sprintf("%s", "foobar");
    

    例如,你给一个常量字符串 %s 转换,你做错了。只需将常量字符串作为格式字符串的一部分。

    推荐文章