0

unescapedstrの最初の文字を見つけるにはどうすればよいですか。次のコードでは、位置14で最初の文字を取得していますが、位置26で文字を探しています。

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

int main ()
{
  char str[] = "FOO + pHWAx \\\"bar AER/2.1\" BAZ";
  printf ("%s\n",str);
  char * pch;
  pch=strchr(str,'"');
  printf ("found at %d\n",pch-str+1);
  return 0;
}
4

1 に答える 1

0

この関数を使用して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。エスケープは言語の規則を構成します。正しく実行するには、処理している言語が何であるかを知っている必要があります。

于 2012-04-15T05:38:34.577 に答える