在缓冲区中查找第一个和最后一个模式

时间:2013-01-04 13:37:22

标签: c char logic

我有一个字符缓冲区,其中包含此格式的文本。

somecontent...boundary="abc_is_the_boundary"
content-length=1234

--abc_is_the_boundary
somecontent
--abc_is_the_boundary

此缓冲区存储在char * buf;

现在我的目标是在这种情况下识别边界值abc_is_the_boundary,并将该边界下缓冲区中的所有内容传递给函数,并获取一个新的字符串来替换它。即使--abc_is_the_boundary也会被发送到该函数。

因此,在这种情况下,传递给函数的缓冲区将是

--abc_is_the_boundary
somecontent
--abc_is_the_boundary

处理完毕后,说它返回xyz

内容长度已更改为3,现在生成的缓冲区必须如下所示

somecontent...boundary="abc_is_the_boundary"
    content-length=3

xyz

我可以使用strstr识别边界值。但是如何找到边界的第一个实例和边界的最后一个实例?边界可以有多次,但只有第一个和最后一个必须找到。可以通过再次使用strstr修改内容长度,并转到特定位置并进行修改。这是最好的方式。

我希望你理解

1 个答案:

答案 0 :(得分:4)

您可以使用简单的指针算法来查找模式的第一个和最后一个匹配项。以这种方式思考:对于模式的第一次出现,您使用strstr的第一个结果,因为这正是此函数的设计目的。然后你问自己“在第一个之后是否会出现另一个模式”并再次使用strstr。你重复这个,直到你发现没有进一步发生。你找到的最后一个必须是整个缓冲区中的最后一个。

然后看起来有点像这样。下面的代码既没有编译也没有经过测试,但这个想法应该是明确的:

char *buf, *pattern, *firstOcc, *lastOcc, *temp;

// ... extract pattern from buffer

firstOcc = strstr(buf, pattern);
temp = firstOcc;

do {
  lastOcc = temp;
  temp = strstr(lastOcc + 1, pattern);
} while(temp != 0);

通过搜索最后找到的位置+ 1,您排除了最后一个位置,然后strstr会在找到最后一个位置后向您发送该位置。