3

我正在查询一个 sqlite 数据库,但我需要将结果(一个 TEXT 属性)转换为一个 C++ std::string。我觉得这应该不难完成,但我遇到了麻烦。

sqlite3_open("sqlite.db", &db);
std::string str = "SELECT something FROM table";
sqlite3_prepare_v2(db,
str.c_str(),
-1,
&m_statement,
0);

sqlite3_step(m_statement);
// OBS: 3rd party printf, cannot use std::cout in this environment
printf("Result1: %s",sqlite3_column_text(m_statement,0)); // OK! Result is printed

string try1 = string(
    reinterpret_cast<const char*>(sqlite3_column_text(m_statement,0))); 
printf("Result2: %s",try1); // null

stringstream ss;
ss << sqlite3_column_text(m_statement,0);
printf("Result3: %s",ss.str()); // null
4

2 回答 2

4

您的问题与 sqlite 无关。当您使用%swith 时printfprintf需要一个char *NOT a std::string

例如改变这个:

 printf("Result2: %s",try1); // null

 printf("Result2: %s",try1.c_str()); 

看看会发生什么。

C++ 有两种主要的实现字符串的方法。遗留 C 字符串 ( char*) 和std::stringC++ 标准库中的类。如果您处理 C API,您将主要处理前者。printf并且sqlite*都来自 C API,因此期望处理char*.

于 2012-12-09T01:44:12.720 回答
3

问题不在于sqlite3_column_text.

printf格式说明符%s需要一个 C 字符串(字符指针)。

由于printf无法检查堆栈上传递了哪些值,因此它必须信任格式说明符。因为格式说明符是%s,它读取一个参数,因为它是一个 char 指针(它不是),但巧合的是,它打印错误的结果,而不是崩溃。

std::string公开一个函数,该函数为您获取一个只读的对应 C 字符串,因此,例如,您的第二种情况将是:

// Get a C string from std::string
printf("Result2: %s", try1.c_str());
于 2012-12-09T01:43:39.023 回答