From the D Blog -- Interfacing D with C: Strings Part One
Виталий Фадеев
vital.fadeev at gmail.com
Wed May 26 04:00:17 UTC 2021
On Monday, 24 May 2021 at 14:02:14 UTC, Mike Parker wrote:
> The blog:
> https://dlang.org/blog/2021/05/24/interfacing-d-with-c-strings-part-one/
>
Good!
toStringz()
Technically we can use 'reserve()' for reserve memory. Possible,
memory already reserved.
s.reserve( s.length + 1 );
Then we can set trailing zero.
s[ $ ] = '\0';
And return pointer.
return s.ptr;
In this case we prevent memory allocation. Operations will be
faster.
In other case we cam:
auto copy = new char[s.length + 1];
copy[0 .. s.length] = s[];
copy[s.length] = 0;
return &assumeUnique(copy)[0];
Example:
immutable(char)* toStringz( ref string s )
{
if ( s.capacity <= s.length )
s.reserve( s.length + 1 );
char* cptr = cast( char* ) s.ptr; // C ptr
char* zptr = cptr + s.length; // zero ptr
*zptr = '\0';
return cast( immutable(char)* ) cptr;
}
Test code: https://run.dlang.io/is/xZwwtw
More information about the Digitalmars-d-announce
mailing list