On Thursday, 28 July 2022 at 23:16:15 UTC, Paul Backus wrote:
On Thursday, 28 July 2022 at 21:52:28 UTC, pascal111 wrote:
On Thursday, 28 July 2022 at 20:36:31 UTC, Paul Backus wrote:
```d
import std.algorithm: filter;
import std.range: empty;
import std.functional: not;

// ...

    auto tokens = input
        .splitter!(c => delimiters.canFind(c))
        .filter!(not!empty);

// ...
```

I think "tokens" is a range. I didn't read much about it, but I figured out that there's no particular way to know the number of elements in a range, or how can you know the elements order and the length of the range?

In this case, the only way is to convert the range to an array, using [`std.array.array`][1]:

```d
import std.array: array;

// ...

    string[] tokens = input
        .splitter!(c => delimiters.canFind(c))
        .filter!(not!empty)
        .array;
```

[1]: https://phobos.dpldocs.info/std.array.array.1.html

What about this version:

string[] d_strtok(const string ch, const string delim)
{

    string[] tokens = ch.
    splitter!(c => delim.canFind(c)).
    filter!(not!empty).array;

    return tokens;
}


////////////////////////


module main;

import std.stdio;
import std.string;
import std.conv;
import dcollect;
import std.math;
/*import std.algorithm;
import std.range: empty;
import std.functional: not;
import std.array;*/

int main(string[] args)
{

    string bad_guy="This is,, an, statement.";
    string[] coco=d_strtok(bad_guy, " ,.");

    for(int i=0; i<coco.length; i++)
        writeln(coco[i]);

        return 0;
}

//////////////////

Really I don't understand all of its code well although it works fine.

Reply via email to