我查询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
答案 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无关。当%s
与printf
一起使用时,printf
期望char *
不是std::string
。
例如改变这个:
printf("Result2: %s",try1); // null
到
printf("Result2: %s",try1.c_str());
看看会发生什么。
C ++有两种实现字符串的主要方式。在C ++标准库中找到的旧C字符串(char*
)和std::string
类。如果你处理C API,你将主要处理前者。 printf
和sqlite*
均来自C API,因此期望处理char*
。