第一次出现,除了C中的转义字符

时间:2012-04-15 05:35:05

标签: c string strchr

如何在str中找到第一个unescaped字符。在下面的代码中,我得到第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;
}

1 个答案:

答案 0 :(得分: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;

如果我们发现某些内容必须是\"

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

如果它不是引用,那么它必须是逃避。我们增加到下一个角色。如果它是终止null,则意味着我们在字符串的末尾有一个反斜杠:一个不正确的转义。

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

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

  string = ++ptr;
}

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

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