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

content-lengthが3に変更され、結果のバッファーは次のようになります。

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

xyz

strstrを使用して境界値を識別できます。しかし、境界の最初のインスタンスと境界の最後のインスタンスを見つけるにはどうすればよいですか?境界は複数回存在する可能性がありますが、最初と最後だけを見つける必要があります。コンテンツの長さは、strstrを再度使用して変更し、特定の場所に移動して変更できます。それが最善の方法です。

ご理解いただけたでしょうか

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 から検索することで、最後の場所を除外します。

于 2013-01-04T13:50:52.980 に答える