0

スペース文字 (' ') で strtok を使用してユーザー入力から引数のリストを作成する C のシェルに取り組んでいます。たとえば、strtok 'ls foo bar' は、ls、foo、bar の 3 つの要素を持つ char* を作成します。

私の質問は、エスケープスペースを検出するにはどうすればよいですか?

たとえば、strtok 'ls foo\ bar' は、ls、foo\、bar の 3 つの要素を持つ char** を作成します。ただし、次の 2 つの要素を持つ char* を作成する必要があります: ls、foo bar

どうすればこれを達成できますか?

4

2 に答える 2

2

はエスケープ文字を理解しないためstrtok、は使用できません。strtokこれをハックすることもできますが、最終的に引用された引数などをサポートしたい場合は、より柔軟なアプローチが必要になります。

代わりにパーサーを作成することを検討してください。入力内のすべての文字をループして、その文字をどうするかを決定します。スペースは次の引数に進み、バックスラッシュは次の文字をそのままコピーし、引用符は引用されたコンテキストを開始します。入力を処理するはるかに柔軟な方法です。の制限に拘束されることはありませんstrtok

于 2012-09-24T16:08:25.187 に答える
0

2 番目の引数を strtok から" "to " \"(「区切り文字」) に変更するだけです。これらは、ユーザー入力がトークンに分割される場所を決定する文字であり、その結果、トークンのリストには含まれません。strtok の詳細については、こちらを参照してください。

編集:申し訳ありませんが、私はあなたを誤解しました。上記のアドバイスは\s を削除するだけです。手動で解析することが最善の方法であることに同意します。などを使用して、一度に 1 つずつ文字を取得するのが最も簡単fgetc()です。

于 2012-09-24T16:04:57.097 に答える