CString::find... 迭代使用问题?
Posted
技术标签:
【中文标题】CString::find... 迭代使用问题?【英文标题】:CString::find... iterative use issue? 【发布时间】:2013-09-10 18:32:06 【问题描述】:我正在使用 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 个字符了...这是问题所在吗?
【问题讨论】:
【参考方案1】:您的第二个Find
调用会找到“DOWNLD”之后的空格,而不是“.DAT”之后的空格。您想在第二次调用 Find
之前增加 i
,以便它引用第一个字符过去第一次调用搜索的字符串。
【讨论】:
我没有说清楚......当前的代码工作正常。我开始按照你的建议做......它没有用。正如我所说,通过调试和辛勤工作,我发现...索引,当第二次使用时,指向过去找到的字符串,而不是开始...它不会在你说的地方停止,它会找到文件大小。无论如何,感谢您的尝试。 这毫无意义。你是说,在i = in.Find("DOWNLD .DAT ");
之后,你发现in[i] != 'D'
?恕我直言,我觉得这很难相信。
只是为了更清楚......中间需要增加索引。 i 返回了它应该返回的点,正如 mid 所使用的那样。这是对 Find 的第二次调用,使用相同的字符串来做有趣的事情,我尝试了 j=in.Find(' ',(i+14)),不行,它返回了 end 第一个搜索字符串,直到它碰到一个空格。我认为这是一个错误......我将尝试搜索子字符串的版本,而不是搜索字符的版本并返回给大家。
定义“不行”。 j=in.Find(' ',(i+14));
究竟会发生什么?结果与您的预期有何不同?另外,在in.Mid((i+14),j-i);
中,第二个参数应该是j-i-14
。更好的是,只需在第一个 Find()
之后立即执行 i += 14;
(如果成功),然后放弃所有其他调整。
好的,我发现了错误......我会在51分钟内发布答案,如果允许的话。【参考方案2】:
所以我没有在 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,并且缺少感兴趣的部分。为什么我的原始修复有效?我猜只是巧合。
感谢您的帮助!
【讨论】:
以上是关于CString::find... 迭代使用问题?的主要内容,如果未能解决你的问题,请参考以下文章
[C/C++]详解STL容器3--list的功能和模拟实现(迭代器失效问题)
[如何在C ++中仅使用迭代器来正确地迭代3D向量? [关闭]