找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1332|回复: 9

关于子串查找的问题?

[复制链接]
发表于 2009-11-3 02:19:15 | 显示全部楼层 |阅读模式 IP:江苏扬州
有一个中英文混合字符串,英文为大小写混编.如"China中国China"
现在我要查找子串,而且不区分大小写,如"a中国Ch"就是一个子串,这要怎么办啊?
如果全是英文就好做了.
发表于 2009-11-3 02:19:16 | 显示全部楼层 IP:江苏扬州
C语言用函数strstr,
C++用函数string::find()
VC用CString::Find()
回复

使用道具 举报

发表于 2009-11-3 02:19:17 | 显示全部楼层 IP:江苏扬州
编写循环,一个一个找,估计也行.但有些麻烦.
回复

使用道具 举报

发表于 2009-11-3 02:19:17 | 显示全部楼层 IP:江苏扬州
strstr是不是区分大小写的啊!
回复

使用道具 举报

发表于 2009-11-3 02:19:18 | 显示全部楼层 IP:江苏扬州
中文怎么编写循环,一个一个找?
回复

使用道具 举报

发表于 2009-11-3 02:19:19 | 显示全部楼层 IP:江苏扬州
做个函数吧:
你可以char c1[20]="China中国China";(函数的第一个参数)然后将他们中的字母全部大写化
(toupper(c1[i++]))然后子串(函数的第2个参数->char c2[20];)也字母全部大写化
(toupper(c2[i++]))最后再来查找返回子串在主串中的首位置
回复

使用道具 举报

发表于 2009-11-3 02:19:20 | 显示全部楼层 IP:江苏扬州
我编了一个,献丑了.
#include "iostream.h"
void main()
{
int i=0,j=0,t=0,k=0,g=0,c=0;
char a[10],b[100];
cout<<"输出总字符串"<<endl;
cin>>b;
cout<<"输出要查找的字符串"<<endl;
cin>>a;
while(a[t]!='\0')t++;
while(b[k]!='\0')k++;
if(t==1)for(;i<k;i++){if(a[0]==b[i])c++;}
else {for(;i<k;i++)
{if(a[0]==b[i])
for(j=1;j<t;j++){if(a[j]!=b[++i])break;else g++;}
if(g==t-1){c++;g=0;}}}
cout<<"子串个数";
cout<<c<<endl;
}

中英文通吃.
回复

使用道具 举报

发表于 2009-11-3 02:19:21 | 显示全部楼层 IP:江苏扬州
以下是引用无限忧伤在2006-5-22 21:50:00的发言:

我编了一个,献丑了.
#include "iostream.h"
void main()
{
int i=0,j=0,t=0,k=0,g=0,c=0;
char a[10],b[100];
cout<<"输出总字符串"<<endl;
cin>>b;
cout<<"输出要查找的字符串"<<endl;
cin>>a;
while(a[t]!='\0')t++;
while(b[k]!='\0')k++;
if(t==1)for(;i<k;i++){if(a[0]==b[i])c++;}
else {for(;i<k;i++)
{if(a[0]==b[i])
for(j=1;j<t;j++){if(a[j]!=b[++i])break;else g++;}
if(g==t-1){c++;g=0;}}}
cout<<"子串个数";
cout<<c<<endl;
}

中英文通吃.


好象你的要区分大小写,请看看题目要求
回复

使用道具 举报

发表于 2009-11-3 02:19:22 | 显示全部楼层 IP:江苏扬州
以下是引用无限忧伤在2006-5-22 21:50:00的发言:

我编了一个,献丑了.
#include "iostream.h"
void main()
{
int i=0,j=0,t=0,k=0,g=0,c=0;
char a[10],b[100];
cout<<"输出总字符串"<<endl;
cin>>b;
cout<<"输出要查找的字符串"<<endl;
cin>>a;
while(a[t]!='\0')t++;
while(b[k]!='\0')k++;
if(t==1)for(;i<k;i++){if(a[0]==b[i])c++;}
else {for(;i<k;i++)
{if(a[0]==b[i])
for(j=1;j<t;j++){if(a[j]!=b[++i])break;else g++;}
if(g==t-1){c++;g=0;}}}
cout<<"子串个数";
cout<<c<<endl;
}

中英文通吃.


这程序对于区分大小写的时候也是不对的。试一下下“aaabcdefg"里找"aab",字串明明存在,但结果为零。实际写这个strstr()的程序需要一个state machine(大约叫状态机器或状态图)。如果不作任何特殊的内存快速操作的话复杂度是N平方所以最好不要自己写,除非想练手。
要不区分大小写的话用strstr则先把字串拷贝一下,再把每个字母变大写toupper()
用CString的话用库函数CString::MakeUpper()把整个字串变大写。
回复

使用道具 举报

发表于 2009-11-3 02:19:23 | 显示全部楼层 IP:江苏扬州
还是不服气,又改进了一下,打死我都不用string类,大小写问题解决了,“aaabcdefg"里找"aab"的问题也解决了.还有那里不对?哥们儿来纠正一下.
#include "iostream.h"
void main()
{
int i=0,j=0,t=0,k=0,g=0,c=0,p=0;
char a[10],b[100];
cout<<"输出总字符串"<<endl;
cin>>b;
cout<<"输出要查找的字符串"<<endl;
cin>>a;
while(a[t]!='\0')t++;
while(b[k]!='\0')k++;
for(i=0;i<k;i++)
if(int(b[i])<=90&&int(b[i])>=65)
b[i]=b[i]+'a'-'A';
for(i=0;i<t;i++)
if(int(a[i])<=90&&int(a[i])>=65)
a[i]=a[i]+'a'-'A';
if(t==1)
for(i=0;i<k;i++)
{if(a[0]==b[i])c++;}
else
{for(i=0;i<k;i++)
{if(a[0]==b[i])
{p=i;for(j=1;j<t;j++){if(a[j]!=b[++p])break;else g++;}}
p=0;
if(g==t-1){c++;}g=0;}}
cout<<"子串个数";
cout<<c<<endl;
}
在此谢过
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 09:21 , Processed in 0.159184 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表