这似乎很简单,但是我是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
上运行答案 0 :(得分:3)
此行是错误的:
sqlquery = &sqlbuff;
sqlbuff
的类型为char []
,因此获取其地址将为您提供指向数组的指针,键入char (*)[]
。您只需要一个指向第一个char
(类型char *
)的指针,并且在大多数情况下评估数组的标识符都会得到这样的指针(有一些例外,例如与{{1}一起使用时) }。所以,只要写
sizeof
也就是说,根本不需要单独的指针变量。 sqlquery = sqlbuff;
的值为sqlbuff
,并且指针可以隐式转换为其char *
限定的对应对象。只需将const
直接传递到期望sqlbuff
的地方,它将起作用。
应该提及另一件事,尽管它与您的问题没有直接关系:您应该永远不要使用字符串操作从用户输入构造SQL查询。攻击者可以通过这种方式轻松地注入自己的SQL代码。阅读您的SQL客户端库的文档,查找准备好的语句和参数绑定,并在需要将用户输入作为SQL查询参数的地方使用它。
还有一个提示:如果您发现自己正在编写类似的代码
const char *
例如,您为sprintf("%s", "foobar");
转换提供了一个常量字符串,这是错误的。只需将常量字符串作为格式字符串的一部分即可。
答案 1 :(得分: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[]
的指针将指向与指向整个数组的指针相同的位置,但是两者的类型不同。