怎么查找一个string 字符串中的子字符串出现的次数和位置?

NewCenturyNewPage 2004-10-14 10:15:01
已知:string s="HelloABCmyc++ABCOKC++ABC";

现在要查找该字符串s的子字符串ABC出现的次数和位置,怎么查找最简捷?
...全文
4091 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewCenturyNewPage 2004-10-14
  • 打赏
  • 举报
回复
demo001(给分是我最大的快乐)
----------------------------
是的,是3个,我看错了,上面已经说了,呵呵。
demo001 2004-10-14
  • 打赏
  • 举报
回复
sh: Pause: command not found

是Unix下不支持Pause屏幕输出命令
demo001 2004-10-14
  • 打赏
  • 举报
回复
最后的3是总个数啊

楼主

你不看我程序的啊?
whoho 2004-10-14
  • 打赏
  • 举报
回复
不会的
string::find的效率很高,你可以尝试去看它代码
如果你使用的stl版本比较次,可以去看SGI的代码
在这个基础上,你统计次数的效率,几乎无可挑剔了
不管如何实现计数,至少将整个串前前后后匹配一遍都是必须的
find实现了无回溯匹配,所以效率自然不会差

你上面的代码有问题,你去看看msdn,string::find有多种版本
你去找提供带offset参数的版本,这样就不用求子串了
NewCenturyNewPage 2004-10-14
  • 打赏
  • 举报
回复
whoho(在北方流浪)

我只知道用find的时候每次要对字符串求子串substr,这样是不是效率不高?

i = s.find("ABC");
while(i>0)
{
s= s.substr(i,s.length()-i);
n++;
i = s.find("ABC");
}
whoho 2004-10-14
  • 打赏
  • 举报
回复
对子串好像也有一个相应的重载版本,查一下就知道了
或者,你可以用string::find,每次提供一个不同的offset即可
NewCenturyNewPage 2004-10-14
  • 打赏
  • 举报
回复
呵呵,看错了,不好意思,sorry,你最后的一个打印出来的是出现的次数。

结贴!
whoho 2004-10-14
  • 打赏
  • 举报
回复
标准库中有一个count算法:
string str = "aaaddea";
cout << count(str.begin(), str.end(), 'a') << "a's";
NewCenturyNewPage 2004-10-14
  • 打赏
  • 举报
回复
demo001(给分是我最大的快乐)

不对哦,运行结果:
5
13
21
3
sh: Pause: command not found

最后怎么多了一个3?
demo001 2004-10-14
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
int intCount=0;
unsigned int loc=0;
string s="HelloABCmyc++ABCOKC++ABC";

while((loc=s.find( "ABC", loc ))!=string::npos)
{
intCount++;
cout << loc++ << endl;
}
cout << intCount << endl;

system("Pause");
return 0;
}
wxwxiaofeng 2004-10-14
  • 打赏
  • 举报
回复
用strstr()可以判断字符串中是否有指定的字符串
NewCenturyNewPage 2004-10-14
  • 打赏
  • 举报
回复
while(s.rfind("ABC")>0)
nCount++;
kobefly 2004-10-14
  • 打赏
  • 举报
回复
没有直接实现你所要求功能的函数
要自己写
查找的话
KMP算法
可以考虑

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧