On Tuesday, 6 December 2022 at 23:41:09 UTC, H. S. Teoh wrote:
On Tue, Dec 06, 2022 at 11:07:32PM +0000, johannes via Digitalmars-d-learn wrote:
//-- the result should be f.i. "the sun is shining"
//-- sqlite3_column_text returns a constant char* a \0 delimited c-string
printf("%s\n",sqlite3_column_text(res, i));
writeln(sqlite3_column_text(res, i));
[...]

In D, strings are not the same as char*. You should use std.conv.fromStringZ to convert the C char* to a D string.


T


no, you don't "need" to use std conv


Here is an alternative that doesn't allocate

Make sure to read the comments


```D

// here notice where the functions are comming from
import std.stdio : writeln, writefln;

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

const(char)* sqlite3_column_text(void*, int iCol)
{
    return "hello world";
}

void main()
{
// printf is a libc function, it expects a null terminated string (char*)
    printf("%s\n", sqlite3_column_text(null, 0));

// writeln is a d function, it expects a string (immutable slice of char aka immutable(char)[], a slice is T* + len)

    // so here we get the string from sqlite
    const(char)* ret = sqlite3_column_text(null, 0);


// then we need to determine the length of the null terminated string from c
    // we can use strlen from libc

    size_t len = strlen(ret);

// now we got a len, we can build a D string, remember, it's just a slice

    string str = cast(string) ret[0 .. len];

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

Reply via email to