在C ++中将sqlite结果转换为std :: string

时间:2012-12-09 01:39:24

标签: c++ sql casting sqlite

我查询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

2 个答案:

答案 0 :(得分:3)

问题不在于sqlite3_column_text

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

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

std::string公开了一个函数,它会为您提供一个只读的相应C字符串,因此,例如,您的第二种情况将是:

// Get a C string from std::string
printf("Result2: %s", try1.c_str());

答案 1 :(得分:3)

您的问题与sqlite无关。当%sprintf一起使用时,printf期望char *不是std::string

例如改变这个:

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

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

看看会发生什么。

C ++有两种实现字符串的主要方式。在C ++标准库中找到的旧C字符串(char*)和std::string类。如果你处理C API,你将主要处理前者。 printfsqlite*均来自C API,因此期望处理char*