A debug class has started
forkit
forkit at gmail.com
Mon Dec 13 20:58:42 UTC 2021
On Monday, 13 December 2021 at 20:28:26 UTC, H. S. Teoh wrote:
> On Mon, Dec 13, 2021 at 08:04:24PM +0000, forkit via
> Digitalmars-d-learn wrote:
>> On Monday, 13 December 2021 at 12:06:53 UTC, WebFreak001 wrote:
>> >
>> > You should really use `.dup` if you want to mutate your
>> > string. (You would need to duplicate anyway if you don't
>> > want an unsafe cast)
>>
>> (this produces an unpredictable result??)
>> char* w = cast(char*)str.dup;
>
> Shouldn't you be using:
>
> char* w = str.dup.ptr;
>
> instead??
>
>
> T
so here are all the possible options I've tried. only 2 of these
actually produce the expected result.
// ------
module test;
import std : writeln, writefln;
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 string constant is
immutable, so expect undefined behaviour.
char* w = strdup(cast(char*)str); // ok
//char* w = cast(char*)str.toStringz; // also ok
// all these below result in an extra character from
'somewhere' appearing in the writeln output
//char* w = cast(char*)str.dup; // nope
//char* w = str.dup.ptr; // nope
//char* w = &dup(cast(const(char)[])str)[0]; // nope
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);
}
// ----------------
More information about the Digitalmars-d-learn
mailing list