の場合、次のコードはスペースを使用して文字列コマンドを分解します(例: "")。私はスペースとフルストップ(同時に)の両方の発生を使用してコマンドを分解し、それ自体ではなくそれぞれを破壊したい場合はどうなりますか?以下のようなコマンドは:作品(引用符を無視して)に分割されます「こんにちは.howはあなたが」 [ハロー] [あなたはどのように今日]文字列トークンが
char *token2 = strtok(command, " .");
の場合、次のコードはスペースを使用して文字列コマンドを分解します(例: "")。私はスペースとフルストップ(同時に)の両方の発生を使用してコマンドを分解し、それ自体ではなくそれぞれを破壊したい場合はどうなりますか?以下のようなコマンドは:作品(引用符を無視して)に分割されます「こんにちは.howはあなたが」 [ハロー] [あなたはどのように今日]文字列トークンが
char *token2 = strtok(command, " .");
:
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;
}
これは、だけではなく、strcspn
とstrspn
のstrstr
とstrlen
を呼び出し、strtok
の実装と全く同じほとんどです。空のトークンを返すこともできます(両端に2つの区切り文字または区切り文字がある場合)。あなたが好きなら、それらを無視する手配をすることができます。
あなたの最善の策は、ちょうどあなたの入力をクロールするかもしれませんstrstr
で、部分文字列の出現を検出し、それらを手動でトークン化します。
よくある質問ですが、私はまだ特に優雅な解決策を見ていません。しかし、上記は簡単で実用的です。
あなたがstrstr
とかなり簡単にそれを行うことができます
独自のトークナイザを書くか、サードパーサー/レクサージェネレータ(lex)やライブラリ(私はCライブラリではなく、C++パーサーライブラリ 'boost :: spirit'しか知りません)を使う必要があります。 –