-1

这看起来很简单,但我是 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上运行

4

2 回答 2

3

这一行是错误的:

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转换提供了一个常量字符串,你做错了。只需将您的常量字符串作为格式字符串的一部分。

于 2018-07-31T14:10:25.767 回答
2

我需要从中做const char*一个char[]

从您的代码示例中,您的意思似乎是您想要一个const char *指向您的char[]. 这非常容易:

sqlquery = sqlbuff;

这是因为数组类型的值在几乎所有表达式上下文中都会自动转换为指针,并且允许将非const类型的值分配给相应的const限定类型的变量。

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

mysql_query(con, sqlbuf);

另一方面,你的尝试,

sqlquery = &sqlbuff;  // wrong

,生成错误类型的指针。 &sqlbuf是指向数组的指针,而sqlquery被声明为指向char的指针。指向第char一个 a的指针char[]将指向与指向整个数组的指针相同的位置,但两者具有不同的类型。

于 2018-07-31T14:07:34.913 回答