0

テキストブロックを検索するためにCStringを使用しています...これが私のコードです:

// locate file name in dir listing
in = *buf;
i = in.Find("DOWNLD  .DAT  ");// find start of name, two spaces (0x20) as delim
                    // size of search text here is 14
if (i == -1) return 0;

j = in.Find(' ',i);// now find next space char *after* file size... 
        // why don't I have to add to i here? There are spaces in my search string.

if (j == -1) return 0;

fileSize = in.Mid((i+14),j-i);// extract file size string, note indexing past found string

return atoi(fileSize.GetBuffer());

MSDN が find の戻り値について述べなければならないことは次のとおりです。「戻り値 要求された部分文字列または文字に一致する、この CString オブジェクトの最初の文字のゼロから始まるインデックス。部分文字列または文字が見つからない場合は -1。」

今、私がこれを読んだ方法では、別の検索を行う前に、見つけた文字列を超えてインデックスを作成する必要があります...しかし、実際には、以前に返された「i」を新しい検索の開始位置として使用します。私は自分のプログラムの他の場所でこれを使用しており、間違いなくそれを超えてインデックスを作成する必要があります (たとえば、::mid() を使用する場合)...設計またはバグ。元の文字列は大きくなる可能性があります。300文字近く見たことがあります...これは問題ですか?

4

2 に答える 2

0

だから私は CString にバグを見つけませんでした...私のコードはエラーでした。動作する変更されたコードは次のとおりです。

    j = in.Find(' ',i+14);// index past searched string 

if (j == -1) return 0;

fileSize = in.Mid((i+14),j-i-14);// note -14 added

return atoi(fileSize.GetBuffer());

私を混乱させたのは、真ん中に-14が欠けていたことでした...結果の文字列は、本来あるべき場所を14過ぎており、関心のある部分が欠けていました。元の修正が機能したのはなぜですか? ただの偶然だと思います。

助けてくれてありがとう!

于 2013-09-11T02:40:51.203 に答える