2012-06-18 19 views
6

私は同じように、私はstrtokはのバージョンが必要だと思う:C++の文字列を逆順にstrtokする方法はありますか?

例えば
char* p = rstrtok(str, delimeters); 

、順次使用して、文字列「こんにちは+ stack_over・フロー」に位置'-''_''+'を取得

「_- +」の区切り文字セットは、私だけ区切り文字、及びその位置、(間にはないコンテンツ)を気に、私はを推測しますはここでは適切ではありません。

私が利用できる既存のユーティリティ機能はありますか?この種の状況に対処するための解決策はありますか?
さらに、私はC++をやっているので、この古いファッションCを避ける便利な方法はありますか?

(私は「逆のstrtokを」検索単に「フロースタックオーバー」ものへ「の流れの上にスタック」を取得...)

+1

を、私はそこにあるとは思いませんあなたのためにこれを行う関数。私はあなたがループを使うべきだと思います。 – nhahtdh

答えて

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 */ 
} 
+0

感謝@ジョー、私はstrpbrkが好きだと思うが、それの逆のバージョンはありますか?または私は文字列を最初に逆にしてこれを使用します。希望はコードのレビューを渡すでしょう... – Lyn

+0

@Lyn私が知る限り、それの逆のバージョンはありません、残念なことに、最初に文字列を逆にする必要があります。 –

8

あなたはstrrchrを使用して独自のロールでした。

C++スタイルstd::stringを使用している場合は、string::find_last_ofを利用できます。

+0

@dirkに感謝します。string :: find_last_ofは良いですが、毎回デリメータのコレクションを繰り返す必要があります。距離を比較して、尾部に最も近いものを見ることができます。 – Lyn

+0

@Lyn:これはあなたの質問では指定されていませんでした。あなたはあなたの質問を編集して、あなたの出力として何を*正確に*書くことができますか? – dirkgently

+0

私は自分自身を守らなければならないと思う...例と出力は "delloimeter setを使って" hello + stack_over-flow "という文字列に ' - '、 '_'、 '+' "+ _-" ";また、私たちは皆、厄介でエラーが起こりやすい方法でやりたいと思っています。 – Lyn

0

はstrtokは、最も基本的なバージョンでは非常に簡単です - 最大で数百行。 "strtok filetype:c"をgoogleに設定すると、さまざまなライブラリでどのように実装されているのかがわかります。

非常に素朴な解決策は、最初に文字列を逆にしてから、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]; 
} 

EDIT:

偶然、私はGoogle検索からタブ昨日で開いて、この博士ドブスのページがあります。http://www.drdobbs.com/conversations-al-go-rithms/184403801

関連する問題