【问题标题】:How do I copy a value that have const unsigned char * type?如何复制具有 const unsigned char * 类型的值?
【发布时间】:2012-04-13 10:15:05
【问题描述】:

我想将 SQLite 数据库中的一些值存储在我的缓冲区中,但是 qlite3_column_text() 具有以下原型:

const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

然后当我这样做时:

out[size] = sqlite3_column_text(stmt, 0);

我收到以下错误消息:

assignment discards qualifiers from pointer target type

我也尝试过使用strcpy(),但收到同样的错误消息。

【问题讨论】:

    标签: c sqlite char constants


    【解决方案1】:

    strdup 很容易;

    out[size] = strdup((const char*)sqlite3_column_text(stmt, 0));
    

    请注意,这将 malloc 副本,因此您必须稍后在指针上调用 free() 才能避免泄漏。

    当然,这假设您的 out 数组可以存储 char* 类型的值,您没有展示它是如何定义的。

    【讨论】:

    • 它对我不起作用。当我做out[size] = strdup((const char *)sqlite3_column_text(stmt, 0)); 我得到assignment from incompatible pointer type out 变量有char** 类型。
    • @Jack 你#include <string.h>了吗?
    • 约阿希姆·伊萨克森:是的。我做到了。
    • @Jack 哎呀,更新了代码行,const char* 的演员表在早些时候丢失了。
    【解决方案2】:

    您正在尝试将 unsigned char* 分配给非指针类型。你应该这样做:

    const unsigned char * out = sqlite3_column_text(stmt, 0);
    printf(out);
    

    一个更大的问题是您想如何处理这些数据以及指针的生命周期。来自sqlite.org 的注释“返回的指针一直有效,直到发生如上所述的类型转换,或者直到调用 sqlite3_step() 或 sqlite3_reset() 或 sqlite3_finalize()。”因此,正如其他人所说,您可能想要分配内存并复制(strdupmallocstrcpy)。

    【讨论】:

      【解决方案3】:
      // Should work?
      #define BUF_SIZE 512
      char buffer[BUF_SIZE];
      
      strncpy( buffer, (const char*)sqlite3_column_text(stmt, 0), BUF_SIZE);
      buffer[BUF_size-1] = '\0';
      

      【讨论】:

      • 但我想复制从sqlite3_column_text() 返回的所有字符串,但我没有它的长度。那么如何设置strncpy()函数的n参数呢?
      • 要知道长度可以使用以下调用:int len = sqlite3_column_bytes(stmt, 0);
      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2013-09-19
      • 1970-01-01
      • 2013-02-08
      相关资源
      最近更新 更多