【问题标题】:Converting sqlite result to std::string in C++在 C++ 中将 sqlite 结果转换为 std::string
【发布时间】:2012-12-09 01:39:23
【问题描述】:

我正在查询一个 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

【问题讨论】:

    标签: c++ sql casting sqlite


    【解决方案1】:

    您的问题与 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*

    【讨论】:

      【解决方案2】:

      问题不在于sqlite3_column_text

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        • 2016-01-28
        相关资源
        最近更新 更多