2017-12-22 4 views
-1

入力が一定の形で得られます。例:C - 区切り文字 "/"でstrtokを使用して "mv <from><to>"の文字列を分割します。

のchar * strの= "MV/Folder1には、/フォルダ2/F1/Folder1に/フォルダ3" 私は私は2つの区切りの文字列になってしまいますようにそれを分割する必要が

STR1 ==/Folder1に/フォルダ2/F1

STR2 ==/Folder1に/フォルダ私はstrtokはを使用してみましたが3

(STR、 "/")が、それは動作しません。区切り文字は のスペースを無視し、 "/"だけを使用します。

アイデア?

ありがとうございました!

+2

の言葉を反復処理する[最もエレガントな方法の可能性の重複文字列](https://stackoverflow.com/questions/236129/the-most-elegant-way-to-iter-the-words-of-a-string) – user0042

+1

strtokは区切り文字をzapsするので、区切り文字としてスラッシュを使用します欠陥がある。スペースを分割する必要があるようです。個人的には、私はstrtokを嫌いです。なぜなら、それは入力を傷つけるからです。 YMMV。 –

+0

この質問は現在タグ付きであり、提案された複製は厳密にC++であるため、それは良い一致であることは明らかではありません。 –

答えて

0

Here is a brief explanation of strtok. "/"を渡すと、strtokに "/"または ""で分割するように指示しています。実際には、strtokはおそらく、分割するためにcharのペアを使用しないで、分割するために各charを使用するので、あなたのニーズに簡単に適合しません。あなたは一緒に行くが、それらにスペースを持って分割項目を再構築するためのロジックを提供する必要があります。 "/"で前後に分割された文字を持つことによって引き起こされる空のトークンを探して、そうすることができます。それはあなたが新しいパス文字列の始まりであることを伝えます。しかし、その解決法は、誰かがmvの後ろに二重スペースを入れて壊す可能性があるため、あまり堅牢ではありません。ほとんどのツールでは、引用符などの外部区切り文字を使用するか、ファイル名とパスの一部であるスペースに "\"を使用する必要があります。

0

strtokに渡す2番目の文字列は、それが検索するパターンではなく、文字セットであり、そのセット内のいずれかのアイテムを検索します。

この場合、我々はパターンを検索する必要があるので、私たちはstrstr(一つの可能​​性のために)で検索を行うことができます。

#include <string.h> 
#include <stdio.h> 

int main() { 
    char* str = "mv /Folder1/folder 2/f1 /Folder1/folder 3"; 

    char *prev = strstr(str, " /"); 
    char *pos; 
    while (NULL != prev) { 
     pos = strstr(prev+1, " /"); 
     printf("%.*s\n", (int)(pos-prev), prev); 
     prev = pos; 
    } 
} 
関連する問題