6

次のような逆バージョンのstrtokが必要だと思います。

char* p = rstrtok(str, delimeters);

たとえば、「+ _-」のデリメータセットを使用して、文字列「hello+stack_over-flow」での位置を順番に取得します'-''_''+'

私はデリメータとその位置(間の内容ではない)だけを気にしているので、boost::split_iteratorここでは適切ではないと思います。

活用できる既存のユーティリティ機能はありますか?またはこの種の状況に対処するための解決策はありますか?
さらに、私はC ++を実行しているので、この昔ながらのCを回避するための便利なアプローチはありますか?

(私は「reversestrtok」を検索しましたが、単に「stackoverflow」から「flowoverstack」のものを取得します...)

4

3 に答える 3

8

を使用して自分でロールすることができますstrrchr

C ++スタイルを使用する場合std::stringは、を活用できますstring::find_last_of

于 2012-06-18T06:40:39.833 に答える
3

あなたはこれを行うことができますstrpbrk

char string[] = "hello+stack_over-flow";

char *pos = string;
while (*pos != '\0' && (pos = strpbrk(pos, "+-_")) != NULL)
{
    /* Do something with `pos` */

    pos++;  /* To skip over the found character */
}
于 2012-06-18T06:42:01.063 に答える
0

strtokは、最も基本的なバージョンでは非常に単純です。最大で数百行です。「strtokfiletype:c」をグーグルで検索すると、さまざまなライブラリにどのように実装されているかがわかります。

非常に単純な解決策は、最初に文字列を逆にしてから、strtok()を実行することです。これは長い文字列には適していませんが、パフォーマンスが必要な場合は、独自のstrtok()をロールしてください。

このようなもの:

void reverse(char* dest, const char* src)
{
    int len = strlen(src);
    int i;
    for(i = 0; i < len; ++i)
        dest[len-i-1] = src[i];
}

編集:

偶然にも、昨日のグーグル検索のタブでこのDr Dobbsページを開いています:http ://www.drdobbs.com/conversations-al-go-rithms/184403801

于 2012-07-04T17:24:30.807 に答える