この関数を使用してstrpbrk
、一度に複数の文字のいずれか1つが最初に出現するものを探します。エスケープ文字をスキップしてはなりません。本当に探しているキャラクターが続いているかどうかを確認する必要があります。
"
つまり、としてエスケープできるものを探したいとしましょう\"
。"
実際には、これはまたはのいずれかを探す必要があることを意味します\
。言い換えると:
char *ptr = strpbrk(string, "\"\\"); /* look for chars in the set { ", \ } */
ただし、エスケープされた引用符には関心がなく、続行する必要があるため、これをループで実行する必要があります。
char *quote = 0;
char *string = str; /* initially points to the str array */
while (*string != 0) {
char *ptr = strpbrk(string, "\"\\");
次に、何かが見つかったかどうかを確認します。
if (!ptr)
break;
何かが見つかった場合は、必然的に\
または"
:
if (*ptr == '"') {
quote = ptr;
break;
}
引用符でない場合は、エスケープである必要があります。次の文字にインクリメントします。終了ヌルの場合は、文字列の末尾にバックスラッシュがあることを意味します。つまり、不適切なエスケープです。
if (*++ptr == 0)
break;
それ以外の場合は、次の文字をスキップしてループを続行し、次のエスケープまたはエスケープされていない引用をスキャンできます。
string = ++ptr;
}
エスケープされていない引用符が発生した場合quote
は、whileループの実行後にそれを指します。それ以外の場合quote
はnullのままです。
このコードは、以外\"
にもエスケープが存在することを前提としていますが、それらはすべて1文字の長さであると想定しています(例:\b
または)\r
。のような長いエスケープがある場合は機能しません\xff
。エスケープは言語の規則を構成します。正しく実行するには、処理している言語が何であるかを知っている必要があります。