How to loop through characters of a string in D language?

Stanislav Blinov stanislav.blinov at gmail.com
Sat Dec 11 09:26:06 UTC 2021


On Friday, 10 December 2021 at 23:53:47 UTC, Ola Fosheim Grøstad 
wrote:

>```d
> char[] dontdothis(string s, int i=0, int skip=0){
>     if (s.length == i) return new char[](i - skip);
>     if (s[i] == ';') return dontdothis(s, i+1, skip+1);
>     auto r = dontdothis(s, i+1, skip);
>     r[i-skip] = s[i];
>     return r;
> }
>```

That is about 500% not what I meant. At all. Original code in 
question:

- duplicates string unconditionally as mutable storage
- uses said mutable storage to gather all non-semicolons
- duplicates said mutable storage (again) as immutable

I suggested to make the second duplicate conditional, based on 
amount of space freed by skipping semicolons.

What you're showing is... indeed, don't do this, but I fail to 
see what that has to do with my suggestion, or the original code.

> Scanning short strings twice is not all that expensive as they 
> will stay in the CPU cache > when you run over them a second 
> time.

>```d
> import std.stdio;
>
> @safe:
> string stripsemicolons(string s) @trusted {
>     int i,n;
>     foreach(c; s) n += c != ';'; // premature optimization
>     auto r = new char[](n);
>     foreach(c; s) if (c != ';') r[i++] = c;
>     return cast(string)r;
> }
>```

Again, that is a different algorithm than what I was responding 
to. But sure, short strings - might as well. So long as you do 
track the distinction somewhere up in the code and don't simply 
call this on all strings.


More information about the Digitalmars-d-learn mailing list