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功能一次查找多个字符中的任何一个字符的第一次出现。您不能跳过转义字符;你必须检查它后面是否跟着你真正要找的字符。

即假设我们想寻找"可以作为\". 实际上,这意味着我们必须寻找"\。换句话说:

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;

如果我们发现某些东西必然是 a \or "

  if (*ptr == '"') {
    quote = ptr;
    break;
  }

如果它不是一个引用,那么它一定是一个转义。我们递增到下一个字符。如果它是一个终止空值,则意味着我们在字符串末尾有一个反斜杠:不正确的转义。

  if (*++ptr == 0)
    break;

否则,我们可以跳过下一个字符并继续循环以扫描下一个转义或未转义的引号。

  string = ++ptr;
}

如果出现未转义的引号,则quote在执行 while 循环后指向它。否则quote保持为空。

此代码假定除了 之外还存在其他转义\",但它们都是一个字符长,例如\bor \r。如果有更长的转义,例如\xff. 转义符构成语言的约定:您必须知道要正确处理的语言是什么。

于 2012-04-15T05:38:34.577 回答