On Monday, 13 December 2021 at 21:13:25 UTC, H. S. Teoh wrote:
What you should be doing is:
return to!string(str[0 .. len]);
Or just:
return str[0 .. len].idup;
T
oh.. so many different ways...(to both produce the same bug, and
also to produce the correct output).
... it's a little mind boggling ;-)
// ----------
module test;
import std : writeln, writefln, assumeUnique;
import std.conv : to;
import core.stdc.string : strdup;
import std.string : toStringz;
void main()
{
string str = "abc;def;ab";
//char* w = cast(char*)str; // nope. a pointer to a string
constant is
// (supposed to be) immutable, so
expect undefined behaviour.
char* w = strdup(cast(char*)str); // ok
//char* w = cast(char*)str.toStringz; // also ok
//char* w = cast(char*)str.dup; // also ok
//char* w = str.dup.ptr; // also ok
writeln(replaceChar(w, str.length, ';', 'X'));
}
immutable(char)[] replaceChar(char* str, ulong len, char ch1,
char ch2)
{
for (ulong i = 0; i < len; i++)
{
if (str[i] == ch1)
{
writefln("Found %c at str[%d]", ch1, i); // fine
str[i] = ch2;
}
}
//return to!(immutable(char)[])(str); // nope .. issue with
null terminator perhaps ??
return str[0 .. len].idup; // ok
//return str[0 .. len].dup; // also ok
//return to!string(str[0 .. len]); // also ok
//return assumeUnique(str[0..len]); // also ok
}
// ---------------------