C - 从 char[] 创建 const char*
C - Create const char* from char[]
这看起来很简单,但我是 C 的新手,在网上找不到任何人问这个问题。我有一个 char[]
,我用 sprintf
设置了它。然后我需要从 char[]
中创建一个 const 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
I need to make a const char*
from that char[]
从你的代码示例来看,你的意思似乎是你想要一个 const char *
指向你的 char[]
的内容。这非常简单:
sqlquery = sqlbuff;
这是因为数组类型的值在几乎所有表达式上下文中都会自动转换为指针,并且允许将非const
类型的值赋值给对应的[=17]变量=]-限定类型。
此外,对于您显示的内容,您甚至不需要变量。您可以只指定数组的标识符作为 mysql_query
的参数。从数组到指针的自动转换同样适用于此,您可以合理地将第二个参数类型中的 const
限定符解释为该函数不会尝试修改指向的数据的承诺。:
mysql_query(con, sqlbuf);
另一方面,你的尝试,
sqlquery = &sqlbuff; // wrong
,生成错误类型的指针。 &sqlbuf
是指向数组 的指针,而sqlquery
被声明为指向字符 的指针。指向 char[]
的第一个 char
的指针将指向与指向整个数组的指针相同的位置,但两者具有不同的类型。
这一行是错误的:
sqlquery = &sqlbuff;
sqlbuff
的类型为 char []
,因此获取其地址会得到一个指向数组 的 指针,类型为 char (*)[]
。您只需要一个指向第一个 char
(类型 char *
)的指针,并且在大多数情况下评估数组的标识符会产生这样的指针(有一些例外情况,例如与 [=18= 一起使用时) ]).所以,只写
sqlquery = sqlbuff;
也就是说,根本不需要单独的指针变量。 sqlbuff
的计算结果为 char *
,并且指针可以隐式转换为其 const
限定的对应物。只需在需要 const char *
的地方直接传递 sqlbuff
即可。
还有一件事应该提到,尽管与您的问题没有直接关系:您应该永远不要使用字符串操作 从用户输入构造 SQL 查询。攻击者可以通过这种方式轻松注入自己的 SQL 代码。阅读 SQL 客户端库的文档并查找 准备好的语句 和 参数绑定 并在任何需要用户输入的地方使用它SQL 查询中的参数。
还有一个提示:如果您发现自己正在编写类似
的代码
sprintf("%s", "foobar");
例如,您为 %s
转换提供了一个常量字符串,您做错了。只需将常量字符串作为格式字符串的一部分即可。
这看起来很简单,但我是 C 的新手,在网上找不到任何人问这个问题。我有一个 char[]
,我用 sprintf
设置了它。然后我需要从 char[]
中创建一个 const 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
I need to make a
const char*
from thatchar[]
从你的代码示例来看,你的意思似乎是你想要一个 const char *
指向你的 char[]
的内容。这非常简单:
sqlquery = sqlbuff;
这是因为数组类型的值在几乎所有表达式上下文中都会自动转换为指针,并且允许将非const
类型的值赋值给对应的[=17]变量=]-限定类型。
此外,对于您显示的内容,您甚至不需要变量。您可以只指定数组的标识符作为 mysql_query
的参数。从数组到指针的自动转换同样适用于此,您可以合理地将第二个参数类型中的 const
限定符解释为该函数不会尝试修改指向的数据的承诺。:
mysql_query(con, sqlbuf);
另一方面,你的尝试,
sqlquery = &sqlbuff; // wrong
,生成错误类型的指针。 &sqlbuf
是指向数组 的指针,而sqlquery
被声明为指向字符 的指针。指向 char[]
的第一个 char
的指针将指向与指向整个数组的指针相同的位置,但两者具有不同的类型。
这一行是错误的:
sqlquery = &sqlbuff;
sqlbuff
的类型为 char []
,因此获取其地址会得到一个指向数组 的 指针,类型为 char (*)[]
。您只需要一个指向第一个 char
(类型 char *
)的指针,并且在大多数情况下评估数组的标识符会产生这样的指针(有一些例外情况,例如与 [=18= 一起使用时) ]).所以,只写
sqlquery = sqlbuff;
也就是说,根本不需要单独的指针变量。 sqlbuff
的计算结果为 char *
,并且指针可以隐式转换为其 const
限定的对应物。只需在需要 const char *
的地方直接传递 sqlbuff
即可。
还有一件事应该提到,尽管与您的问题没有直接关系:您应该永远不要使用字符串操作 从用户输入构造 SQL 查询。攻击者可以通过这种方式轻松注入自己的 SQL 代码。阅读 SQL 客户端库的文档并查找 准备好的语句 和 参数绑定 并在任何需要用户输入的地方使用它SQL 查询中的参数。
还有一个提示:如果您发现自己正在编写类似
的代码sprintf("%s", "foobar");
例如,您为 %s
转换提供了一个常量字符串,您做错了。只需将常量字符串作为格式字符串的一部分即可。