2011-08-21 12 views
2

の場合、次のコードはスペースを使用して文字列コマンドを分解します(例: "")。私はスペースとフルストップ(同時に)の両方の発生を使用してコマンドを分解し、それ自体ではなくそれぞれを破壊したい場合はどうなりますか?以下のようなコマンドは:作品(引用符を無視して)に分割されます「こんにちは.howはあなたが」 [ハロー] [あなたはどのように今日]文字列トークンが

char *token2 = strtok(command, " ."); 
+0

独自のトークナイザを書くか、サードパーサー/レクサージェネレータ(lex)やライブラリ(私はCライブラリではなく、C++パーサーライブラリ 'boost :: spirit'しか知りません)を使う必要があります。 –

答えて

3

char *strstrtok(char *str, char *delim) 
{ 
    static char *prev; 
    if (!str) str = prev; 
    if (str) { 
     char *end = strstr(str, delim); 
     if (end) { 
      prev = end + strlen(delim); 
      *end = 0; 
     } else { 
      prev = 0; 
     } 
    } 
    return str; 
} 

これは、だけではなく、strcspnstrspnstrstrstrlenを呼び出し、strtokの実装と全く同じほとんどです。空のトークンを返すこともできます(両端に2つの区切り文字または区切り文字がある場合)。あなたが好きなら、それらを無視する手配をすることができます。

3

あなたの最善の策は、ちょうどあなたの入力をクロールするかもしれませんstrstrで、部分文字列の出現を検出し、それらを手動でトークン化します。

よくある質問ですが、私はまだ特に優雅な解決策を見ていません。しかし、上記は簡単で実用的です。

あなたが strstrとかなり簡単にそれを行うことができます