【问题标题】:First occurrence except escaped chars in C第一次出现,除了 C 中的转义字符
【发布时间】:2012-04-15 05:35:04
【问题描述】:

如何找到 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;
}

【问题讨论】:

  • 万一这不会是家庭作业,其中规定必须使用strchr?
  • @Kaz:谢谢!不,我只是认为strchr 处理大字符串会更好。

标签: c string strchr


【解决方案1】:

使用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;
  }

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

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

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

  string = ++ptr;
}

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

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

【讨论】:

  • 琐事:术语“break”(strpbrk,指向中断的指针)和“span”(strspn,strcspn)来自文本处理语言中的模式函数 BREAK 和 SPAN SNOBOL。
  • 不会 string = ++ptr; 需要是 string = ptr + 2; 所以它会跳过报价?
  • 是的,抱歉,那是错误的。我会解决的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
相关资源
最近更新 更多