我有一个字符缓冲区,它将包含这种格式的文本。
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修改content-length,到具体位置修改。这是最好的方法吗?
希望你能理解
最佳答案
您可以使用简单的指针算术来查找模式的第一次和最后一次出现。这样想:对于模式的第一次出现,您使用 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 将向您提供最后找到的位置之后的位置。
关于c - 查找缓冲区中的第一个和最后一个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14158235/