使用MYSQL C API查询结果时。结果以MYSQL_ROW
类型返回,根据MYSQL C API文档,我可以轻松地printf("%s", row[0])
。但是,如果我想将row[0]
的内容转换为字符串或char *?
答案 0 :(得分:1)
%s格式只能接受char *所以从你的描述来看,看起来MYSQL_ROW实际上是一个char **,而且[0]行将产生一个char *。
我不知道如何使用sprintf()(或更安全但非标准的asprintf())会有什么好处,但如果它让你感觉更好,你可以考虑它。
答案 1 :(得分:0)
你可以使用sprintf(),但你仍然需要知道row [0]中包含的字符串的长度,这样你就可以分配足够的内存。
警告:BCS正确地指出,如果row [0]包含额外的nul字节,您的数据将被截断。如果您知道在行[0]中存储了多少数据,则使用memcpy()可能是更好的解决方案。
答案 2 :(得分:0)
但是如果我想将row [0]的内容转换为字符串或char *,该怎么办?
使用mysql_fetch_lengths
确定MYSQL_ROW
中数组的长度。由于该行中有1列或更多列,因此可以有1列或更多长度。
根据27.8.5 C API Data Structures文档:
MYSQL_ROW
这是一行数据的类型安全表示。目前是 实现为计数字节字符串的数组。 (你不能 如果字段值可能包含二进制,则将它们作为以空字符结尾的字符串 数据,因为此类值内部可能包含空字节。) 通过调用
mysql_fetch_row()
获得。
然后,mysql_fetch_row
文档给出了以下示例:
MYSQL_ROW row;
unsigned int num_fields;
unsigned int i;
num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
{
unsigned long *lengths;
lengths = mysql_fetch_lengths(result);
for(i = 0; i < num_fields; i++)
{
printf("[%.*s] ", (int) lengths[i],
row[i] ? row[i] : "NULL");
}
printf("\n");
}
这里是一个使用它对表中的行进行计数的示例。该表是从FTC的Do No Call violations填充的。
MYSQL_RES* res = NULL;
MYSQL row;
const char SELECT_STMT[] = "SELECT COUNT(*) FROM blacklist_ftc";
if (mysql_query(mysql, SELECT_STMT) != 0)
{
/* handle error */
goto finish;
}
if ((res = mysql_store_result(s_mysql)) == NULL)
{
/* handle error */
goto finish;
}
if (mysql_num_fields(res) != 1 || mysql_num_rows(res) != 1)
{
/* handle error */
goto finish;
}
char buf[32];
unsigned long* length;
row = mysql_fetch_row(res);
length = mysql_fetch_lengths(res);
if (row == NULL || length == NULL)
{
/* handle error */
goto finish;
}
size_t size = length[0] < sizeof(buf)-1 ? length[0] : sizeof(buf)-1;
memcpy(buf, row[0], size);
buf[size] = '\0';
unsigned long count = (unsigned long)atoi(buf);
finish:
if (res)
{
mysql_free_result(res);
res = NULL;
}