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() 时)......我想知道为什么会发生这种情况,如果设计或漏洞。原始字符串可以很大;我已经在 300chars 附近看到它了……这是问题所在吗?

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 回答
0

您的第二次Find调用会找到“DOWNLD”之后的空间,而不是“.DAT”之后的空间。您希望i在第二次Find调用之前递增,以便它引用您第一次调用搜索的字符串之后的第一个字符。

于 2013-09-10T18:42:24.153 回答