首页 > 解决方案 > C - 从 char[] 创建 const char*

问题描述

这看起来很简单,但我是 C 新手,在网上找不到任何人问这个问题。我有一个char[]我用sprintf. 然后我需要从中制作const char*一个char[]。这是可能的还是我需要玩我的类型?我需要一个const char*进入 MySQL 查询,但我需要,char[]因为我需要使用sprintf将变量值插入到结果中。这是代码片段:

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)

它工作正常。问题是我需要sprintf使用该变量。感谢所有帮助。

编辑:在HP-UX 11.11上运行

标签: cmysql-connector-c

解决方案


这一行是错误的:

sqlquery = &sqlbuff;

sqlbuff有类型char [],所以获取它的地址会给你一个指向数组类型的指针char (*)[]。您只需要一个指向第一个char(类型char *)的指针,并且在大多数情况下评估数组的标识符会产生这样的指针(有一些例外情况,例如使用 with 时sizeof)。所以,只写

sqlquery = sqlbuff;

也就是说,根本不需要单独的指针变量。sqlbuff计算结果为char *,并且指针可隐式转换为其const- 限定对应项。只需sqlbuff直接通过 aconst char *预期的位置,它就会起作用。


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


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

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

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


推荐阅读