d的符星示例

原文

//-- 结果应为f.i. "哈哈"
//-- sqlite3_column_text返回`C串`
printf("%s\n",sqlite3_column_text(res, i));
writeln(sqlite3_column_text(res, i));
writefln("%s",sqlite3_column_text(res, i));
writefln(std.conv.to!string(sqlite3_column_text(res, i)));

//-- 结果:
哈哈
55B504B3CE98
55B504B3CE98
哈哈

char*,必须用std.conv.to!string(..)吗?"%s"的意思?

D中,char*不一样.要用std.conv.fromStringZ(可避免分配)转换符*D串.

还有不分配内存的转换版本,注意注释:

// 函数源
import std.stdio : writeln, writefln;

import core.stdc.stdio : printf;
import core.stdc.string : strlen;

const(char)* sqlite3_column_text(void*, int iCol)
{
    return "你好";
}

void main()
{
    // printf是需要0终止串`(char*)`的`libc`函数
    printf("%s\n", sqlite3_column_text(null, 0));

    // writeln是d函数,期望(是符的不变切片)串,切片是`T*+长度`.

    // 从sqlite中取串
    const(char)* ret = sqlite3_column_text(null, 0);


    // 决定长度,
    size_t len = strlen(ret);

    // 构建切片.
    string str = cast(string) ret[0 .. len];

    writeln(str);
    writefln("%s", str);
}

你这里发布的代码是不安全代码的完美示例:

import std;

char *sqlite3_column_text() @system {
    return cast(char *)"哈哈".ptr;
}

void main() {
    printf("%s\n",sqlite3_column_text());
    writeln(sqlite3_column_text());
    writefln("%s",sqlite3_column_text());
    writefln(std.conv.to!string(sqlite3_column_text()));
}

不安全代码很麻烦.小心使用:

char[] s1 = fromStringz(sqlite3_column_text());

writeln(s1); // 一切正常

char[] s2 = fromStringz(sqlite3_column_text()); // 其他一些sqlite3API调用

writeln(s1); // sqlite3搞砸了s1

这是释放后使用.D可用@safe加上-dip1000开关来检测:

@safe:
import std;

char *sqlite3_column_text() @system {
    return cast(char *)"哈哈".ptr;
}

string trusted_sqlite3_column_text() @trusted {
    return std.conv.to!string(sqlite3_column_text());
}//这里可分配.

void main() {
    printf("%s\n",sqlite3_column_text());       // 不!
    writeln(sqlite3_column_text());             // 不!
    writefln("%s",sqlite3_column_text());       // 不!
    writefln(std.conv.to!string(sqlite3_column_t));// 不!
    writeln(trusted_sqlite3_column_text());     // 好!
}

也许用sqlite3_column_blob()sqlite3_column_bytes()按串提取列文本会更有效?

posted @   zjh6  阅读(34)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示