【发布时间】:2020-06-11 20:59:20
【问题描述】:
我是 C++ 的新手,刚刚得到 C++ 使用 mysql++.h 查询 sql 数据库
SQL 查询本身有效,我可以打印出结果。
char *token;
Query query = conn.query();
query << "SELECT title, description FROM mydb.mytable LIMIT 2";
StoreQueryResult ares = query.store();
for (size_t i = 0; i < ares.num_rows(); i++) {
cout << "Title: " << ares[i]["title"] << " - Description: " << ares[i]["description"] << endl;
const char delim[] = "; \t";
//Error when I add this line
//token = strtok( ares[i]["description"] , delim);
//rest of strtok code which works with normal strings, but not mysqlstring
...
}
关键问题是我试图用该行将描述解析为单词
token = strtok( ares[i]["description"] , delim);
我得到了错误
error: conversion from ‘const mysqlpp::String’ to ‘char*’ is ambiguous
所以我的理解是 strtok 需要一个 char* 并且 conn 返回一个 const mysqlpp::String,我猜这是有道理的。但是,如何将 mysqlpp::String 与其他需要 char* 的普通函数一起使用?
我正在查看 here 以获取一些提示,但卡住了。
我已经尝试过用..转换之类的方法
ares[i]["description"].c_str();
这导致从“const char*”到“char*”的转换无效
char * c = ares[i]["description"].c_str()
这给出了类似的错误。
所以我在这一点上有点迷茫,如何在其他地方使用 mysqlpp::String,将它与采用 char* 或 std::string 的函数一起使用的最佳方法是什么?
模棱两可的意思是什么?
【问题讨论】:
-
指针
.c_str()返回的内容不应该被修改。但是strtok实际上是这样做的。您可以使用strdup获取可修改的副本。 -
不要使用
strtok,而是查找MySQL字符串类型,看看它是否有一些可以使用的方法。 -
然后
strdup需要释放内存。不管字符串类型如何,最好不要使用strtok,因为它还有其他缺陷,例如依赖静态缓冲区。 -
mysqlpp::String定义了多个隐式转换操作,这导致了歧义。但更重要的是,mysqlpp::String是一个 不可变 类型。它不公开任何允许您更改其数据的功能,仅通过assign()和operator=分配新数据。但是strtok()想要改变数据。
标签: c++