我有一个字符缓冲区,其中包含此格式的文本。
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修改内容长度,并转到特定位置并进行修改。这是最好的方式。
我希望你理解
答案 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会在找到最后一个位置后向您发送该位置。