2

我有一个字符缓冲区,它将包含这种格式的文本。

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,到指定位置修改。是不是最好的办法。

我希望你已经明白

4

1 回答 1

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 将在找到最后一个位置之后将位置传递给您。

于 2013-01-04T13:50:52.980 回答