c - 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上运行
解决方案
这一行是错误的:
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
转换提供了一个常量字符串,你做错了。只需将您的常量字符串作为格式字符串的一部分。
推荐阅读
- django - Django modelform字段如何禁用和防止篡改?
- javascript - Django - 无法访问根文件夹下的静态 css 文件。控制台中的错误 404
- rest - 测试我是否通过 TLS1.2 进行通信的 Rest 服务
- javascript - 根据上一个下拉菜单中的选定值填充下拉菜单?
- android - 带有 ConstraintLayout 的自定义 DialogFragment
- javascript - 如何使用javascript将值转换为数组
- python - 无法从 PyCharm 导入 TensorFlow
- r - 避免重新排序和分组重复的 x 值 ggplot (geom_point)
- python - 熊猫面板已弃用,
- reactjs - Reselect 相对于容器组件的优势