On Thursday, 28 July 2022 at 19:17:26 UTC, pascal111 wrote:
What's the "strtok" - C function - D equivalent?

https://en.cppreference.com/w/cpp/string/byte/strtok

Closest thing is probably `std.algorithm.splitter` with a predicate:

```d
import std.algorithm: splitter, canFind;
import std.stdio;

void main()
{
    string input = "one + two * (three - four)!";
    string delimiters = "! +- (*)";
    auto tokens = input.splitter!(c => delimiters.canFind(c));
    foreach (token; tokens) {
        writef("\"%s\" ", token);
    }
}
```

Output:

```
"one" "" "" "two" "" "" "" "three" "" "" "four" "" ""
```

Unlike `strtok`, this code does not skip over sequences of multiple consecutive delimiters, so you end up with a bunch of empty tokens in the output. To exclude them, you can use `std.algorithm.filter`:

```d
import std.algorithm: filter;
import std.range: empty;
import std.functional: not;

// ...

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

// ...
```

Reply via email to