大家看看这个华为的题怎么作,关于字符串的
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
求str1中abcd出现的次数
以下是我写的但是不对 输不出来,麻烦帮我看看那里错了?我用的是每4个一比较,逐个比较
#include "stdio.h"
#include "string.h"
main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
char *p,*t;
p=str1;
t=str2;
int k=0;
int i=0;
int j=0;
int len=strlen(str1);
for(i=0;i<=len-1;i++)
p++; t=str2;
for(j=0;j<4;j++)
if(*p==*t)
{
p++;
t++;
}
k++;
if(j==3)
printf("%d",k);
return k;
}
问题点数:10、回复次数:99Top
1 楼zez(思恩 闭关练功ing...)回复于 2006-03-20 16:18:19 得分 0
规定不能用 strstr 了么?否则为什么不用Top
2 楼luanqibazao(努力挣钱供房子)回复于 2006-03-20 16:28:11 得分 0
革命尚未成功,楼主还需努力Top
3 楼haozi112(foring)回复于 2006-03-20 16:37:03 得分 0
呵呵,开个玩笑的说: 从这道题的字面上,有一个a,就有1个abcd,写个循环,找a的个数就可以了Top
4 楼yangw150(永远超越)回复于 2006-03-20 16:49:48 得分 0
那怎么行那?楼上的显然不对,如果是aaaaabcdTop
5 楼RyeCatcher(The Catcher in the Rye)回复于 2006-03-20 16:50:03 得分 2
#include <stdio.h>
#include <string.h>
main()
{
int i;
int j;
int num;
int len;
char str1[] = "abcdnabcdmabcduabcdoabcdg";
char str2[] = "abcd";
char *p, *t;
p = str1;
t = str2;
num = 0;
len = strlen(str1);
for(i = 0; i < len; i++)
{
if(*p == 'a')
{
for(j = 0; j < 4; j++)
{
if(p++ == t++)
;
}
t = str2;
num++;
}
else
{
p++;
}
}
printf("%d\n", num);
}Top
6 楼jinjiajie(leorio)回复于 2006-03-20 16:56:21 得分 0
int strstr_cnt(const char *string ,const char *substring)
{
int i,j,k,count=0;
for(i=0;string[i];i++)
for(j=i,k=0;string[j]==substring[k];j++,k++)
if(!substring[k+1])
count++;
return(count);
}
....这个题目出现n次了Top
7 楼expert2000(ZLX)回复于 2006-03-20 16:59:26 得分 0
RyeCatcher(The Catcher in the Rye)代码思路很清晰,楼主的代码,最开始的p++,不知道要干什么。Top
8 楼yinqing_yx(淘汰引擎)(玩虚一族)回复于 2006-03-20 17:12:36 得分 0
int substr_time(const char *strSrc, const char *strSub)
{
int appTime = 0;
cout << strlen(strSub)<<endl;
while(*strSrc != '\0')
{
if( *strSrc == strSub[0] )
{
if(!strncmp(strSrc,strSub,strlen(strSub)))
{
appTime++;
}
}
strSrc++;
}
return appTime;
}Top
9 楼yangw150(永远超越)回复于 2006-03-20 17:17:47 得分 0
我得思路是每4个一比较,abcdnabcdmabcduabcdoabcdg这个字符串,前4个比较完后,第二次是从第二个到第5个,就是bcdn比较,依此类推,所以那个p++就是使指针指到下一个位置,因为赋初值的时候,p=str1,循环完一次后p=str1+1,指向字符bTop
10 楼luanqibazao(努力挣钱供房子)回复于 2006-03-20 17:22:29 得分 0
for(i=0;i<=len-1;i++)
p++;
执行完后,p就指到最后面去了。每次p++后并没有进行比较。Top
11 楼xiaobubu()回复于 2006-03-20 17:43:38 得分 0
方法不对的 兄弟!Top
12 楼yangw150(永远超越)回复于 2006-03-20 18:20:32 得分 0
那位仁兄的程序我能看懂,也很好理解,但是我那种方法不对吗?Top
13 楼hustacsky(见好不收)回复于 2006-03-20 19:05:10 得分 0
for(i=0;i<=len-1;i++)
p++; t=str2;
for(j=0;j<4;j++)
第一个for循环只能管到p++; ???注意加{}号,Top
14 楼lonelyforest(一生所爱)回复于 2006-03-20 19:30:20 得分 0
字符串啊字符串! 我痛恨你!!!!!Top
15 楼citywanderer2005(流浪狗)回复于 2006-03-20 19:53:47 得分 0
#include <iostream>
using namespace std;
int main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
const int len = 4;
int num = 0;
int j = 0;
for(int i=0; str1[i] != '\0'; i++)
{
if(str1[i] == str2[j])
{
if(j == len - 1)
{
num ++;
j = 0;
}
else
{
j++;
}
}
else
j = 0;
}
cout<< num<< endl;
}Top
16 楼zylthinking()回复于 2006-03-20 20:35:58 得分 0
char str1[]="abcdnabcdmabcduabcdoabcdg";
求str1中abcd出现的次数?
还编什么,自己拿手指头数,然后直接return.呵呵
Top
17 楼beamroad(永)回复于 2006-03-20 21:12:48 得分 0
咱也来个
#include "stdio.h"
void get_next(char *ch, int len ,int *next )
{
int j,k;
j=0;
k=-1;
next[0]=-1;
while(j<len)
{
if(k==-1||ch[j]==ch[k])
{
j++;
k++;
if(ch[j]==ch[k])
next[j]=next[k];
else
next[j]=k;
}
else
k=next[k];
}
}
int kmpindex(char *s,char *t,int s_len, int t_len,int star)
{
int next[20],i=star,j=0,v;
get_next(t,t_len,next);
while(i<s_len&&j<t_len)
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
j=next[j];
if(j==t_len)
v=i-t_len;
else
v=-1;
}
return(v);
}
void main()
{
int j,s_len,t_len, n=0 , star=0;
char *s="abcdnabcdmabcduabcdoabcdg";
char *t="abcd";
while(star<=s_len-t_len&&j!=-1)
{
j=kmpindex(s,t,s_len,t_len,star);
star=j+t_len+1;
if(j!=-1) n++ ;
}
printf("%d\n", n );
}Top
18 楼love830315(因为笨,所以要比别人更努力)回复于 2006-03-20 21:39:02 得分 0
C++数据结构第一章还是第二章.
既使现场不记得那个算法,也可以一个个的移嘛.Top
19 楼yuan2yyh((圆)2)回复于 2006-03-20 21:47:16 得分 0
int getcount(char *str1,char *str2)
{int len=0;n=0;
for(;str1!='\0';str1++)
{ while(len<strlen(str2))
{if(*str1==*str2++)
len++;
else break;
}
if(len==strlen(str2))
n++;
}
return n;
}Top
20 楼wuchengwei()回复于 2006-03-20 21:53:00 得分 0
KMP算法,自己看数据结构书去Top
21 楼mrxiaohutushen()回复于 2006-03-20 22:21:15 得分 0
以我看搂主的代码有问题.
第二个for中指针p++后出循环体后p的值p++时的指针在第五个字符上(相对的).(本意应在第二个吧,只有有符合条件的才应在第五个上)
故应该在第二个for中新设一个指针=p;Top
22 楼piscesfish()回复于 2006-03-20 22:21:51 得分 0
现在到底是C好用还是C++好用?好多的程序可能算出来的结果都是一样的,但好懂的好象还是C些是吗?Top
23 楼shimlyhyb()回复于 2006-03-20 22:29:44 得分 0
提供一个,自己看吧^_^!
#include <stdio.h>
#include <stdlib.h>
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int Find_str(char *,char *);
void main()
{
int num;
num = Find_str(str1,str2);
printf("the num is %d",num);
}
int Find_str(char *str1,char *str2)
{
char *ptr1;
char *ptr2;
char *ptr;
int retcode = 0;
ptr1 = str1;
while(*ptr1!='\0')
{
if(*ptr1==*str2)
{
ptr=ptr1;
ptr2=str2;
while((*ptr!='\0')&&(*ptr2!='\0')&&(*ptr==*ptr2))
{
ptr++;
ptr2++;
}
if(*ptr2=='\0')
{
retcode++;
}
}
ptr1++;
}
return retcode;
}Top
24 楼nipcdll()回复于 2006-03-21 08:52:33 得分 0
学习Top
25 楼sunchuang(方冰)回复于 2006-03-21 09:06:56 得分 0
运行过了,好用的!
#include "stdio.h"
#include "string.h"
void main()
{
char str1[] = "abcdnabcdmabcduabcdoabcdg";
char str2[] = "abcd";
unsigned count = 0;
unsigned j = 0;
unsigned k;
for (unsigned i = 0; i < strlen(str1) - 3;)
{
k = 0;
j = i;
while (str1[i] == str2[k])
{
i++;
k++;
}
if (k >= strlen(str2))
{
i = j + 4;
count++;
}
else if (k == 3)
{
i = j + 3;
}
else if (k == 2)
{
i = j + 2;
}
else
{
i = j + 1;
}
}
printf("%d\n",count);
}Top
26 楼bughole(虫洞)回复于 2006-03-21 09:31:55 得分 0
可以先自己写一个查找字符串的函数,
如 int find(char str1[], char str2[], int i);
其中str1为原字符串,str2为被查找字符串(假设str1和str2最后一个字符是 '\0'),
i是从这个字符串中最几个字符开始查找。 当找到后,返回被查找
字符串第一个出现的位置,如果未找到,返回-1.
然后在主程序中用如下代码
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int count = 0;
int pos; // 4为str2的长度(可以用strlen得到,不会连这个函数也不让用吧?
for(pos = find(str1, str2, 0); pos != -1;
pos = find(str1, str2, pos + 4))
count++;
printf("the repeat count: %d\n", count);
Top
27 楼jimmy212(dear jim)回复于 2006-03-21 10:05:58 得分 0
地球人都做了一个,那我也要做一个,哈
#include "iostream.h"
void main(void)
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
int count=0;
char* p,
* q;
q=p=str1;
while (*p!='\0') {
if (*p=='a') {
for (int temp=0;*(++p)- *(q++)==1;) {
temp++;
temp%=4;
if (temp==3) {
count++;
break;
}
}
}
++p;++q;
}
cout<<"akjsdfalsfjas;dlf :"
<<count
<<endl;
}Top
28 楼niaosky(鸟兽)回复于 2006-03-21 10:06:10 得分 0
把"abcd" Replace成"abcde"存入零一个变量,
比较两个变量长度,长度大了几位就有几个
这么简单还用循环???Top
29 楼cestar2005(往事随风)回复于 2006-03-21 10:28:38 得分 0
呵呵,改一个看看,没运行过的
#include <stdio.h>
#include <string.h>
main()
{
int i;
int j;
int num;
int len;
int tempnum;
char str1[] = "abcdnabcdmabcduabcdoabcdg";
char str2[] = "abcd";
char *p, *t;
p = str1;
t = str2;
num = 0;
tempnum = 0;
len = strlen(str1);
for(i = 0; i < len; i++)
{
if(*p == 'a')
{
for(j = 0; j < 4; j++)
{
if(p++ == t++)
{tempnum++;}
else
{break;}
}
if(tempnum==4)
{num++;}
tempnum=0;
t = str2;
}
else
{
p++;
}
}
printf("%d\n", num);
}
Top
30 楼tony_dagoo()回复于 2006-03-21 10:41:34 得分 0
楼上的楼上 Replace 也是查找和替换两步合成的.你这样做相当于多干了件事儿.Top
31 楼pgmsoul(游侠)回复于 2006-03-21 10:42:26 得分 0
这个题目很简单,怎么一说是化为的就这么多人做.Top
32 楼niaosky(鸟兽)回复于 2006-03-21 10:50:35 得分 0
楼上的楼上 Replace 也是查找和替换两步合成的.你这样做相当于多干了件事儿.
----------------------------------------------------------------------------
既然有现成的函数为什么手写这么多代码Top
33 楼missle(闪人)回复于 2006-03-21 10:55:39 得分 0
顺便发表一下,上面的code很奇怪,很多code中使用了if(*p == 'a')
{
for(j = 0; j < 4; j++)的内存code,不是一个很好的做法,如果是为了特殊字符串做的优化还说的过去,否则,这些code没有任何通用性, 改成str[0],或者,strlen(str),也稍微好点吧,最好还是写个匹配子串的函数,然后计算count,算好点吧.Top
34 楼missle(闪人)回复于 2006-03-21 10:56:31 得分 0
误: '内存' => '类似'Top
35 楼yleiou(单刀匹马)回复于 2006-03-21 10:58:51 得分 2
#include "stdio.h"
#include "string.h"
void main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int i, j , m, n = 0;
for (i = 0; i < strlen(str1); i++)
{
m = i;
for (j = 0; j < 4; j ++)
{
if (str1[m] == str2[j])
{
m++;
}
}
if (j == 4)
{
i = i + 4;
n ++;
}
}
printf("共有%d个子串\n",n);
}Top
36 楼anterla1998(枫叶)回复于 2006-03-21 11:21:00 得分 0
我要是没有记错的话,C语言版的数据结构讲关于字符串匹配问题中矩的第一个没有用任何类似KMP算法的例子就是这个。并且在2006年南开大学软件工程专业的研究生考试中考的就是这么一个编程大题。
Top
37 楼pp616(坏蛋)回复于 2006-03-21 12:39:09 得分 0
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
string s1(str1);
int count=0;
char *p=search(s1.begin(),s1.end(),str2,str2+strlen(str2));
while(p!=s1.end())
{
count++;
s1.erase(p,p+strlen(str2));
p=search(s1.begin(),s1.end(),str2,str2+strlen(str2));
}
cout<<count<<endl;
return 0;
}Top
38 楼smile9961(good life)回复于 2006-03-21 12:45:47 得分 0
niaosky(鸟兽)的方法:
把"abcd" Replace成"abcde"存入零一个变量,
比较两个变量长度,长度大了几位就有几个
这么简单还用循环???
-----------------------------------------------
我覺得這也不失為一中好方法啊,大家為何要用循環;誰能告訴我這是為什么?Top
39 楼longituder(大G)回复于 2006-03-21 13:57:39 得分 0
#include "stdio.h"
int find(char *str1, char *str2)
{
int i, j, k;
int nCount = 0;
for (i = 0; str1[i]; i++)
{
j = i;
k = 0;
while (str1[j++] == str2[k++]);
if (str2[--k] == '\0')
nCount++;
}
return nCount;
}
main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int nCount = find(str1, str2);
printf("The count is %d", nCount);
}
Top
40 楼gjianpro(#ifndef _DEBUG)回复于 2006-03-21 14:49:25 得分 0
#include<stdio.h>
#include<string.h>
int subStringCount(const char* str,const char* sub);
void main()
{
int n;
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
n=subStringCount(str1,str2);
printf("%d\n",n);
}
int subStringCount(const char* str,const char* sub)
{
char *p,*temp;
int count=0;
p=strstr(str,sub);
while(p)
{
count++;
temp=p+strlen(sub);
p=strstr(temp,sub);
}
return count;
}
程序经vc6调试通过.Top
41 楼zyfhfx(小山坡)回复于 2006-03-21 14:53:52 得分 4
#include <iostream>
using namespace std;
/*char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
求str1中abcd出现的次数*/
int find(const char * src, const char * key)
{
char * p1 = (char*)src;
char * p2 = (char*)key;
int sums=0;
while(*p1)
{
if (0 == (strncmp(p1, p2, 4)))
{
sums++;
p1 += 4;
}
else
{
p1++;
}
}
return sums;
}
void main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int sums;
sums = find(str1, str2);
cout << sums << endl;
}
Top
42 楼duaimin()回复于 2006-03-21 15:11:26 得分 0
楼上的经典!Top
43 楼besthyq(寻欢醉一场,但愿长醉不愿醒!)回复于 2006-03-21 15:28:20 得分 2
#include <stdio.h>
#include <string.h>
main()
{
int i;
int j;
int num;
int len;
int h;
char str1[] = "abadnabcdmabcduabcdoabcdg";
char str2[] = "abcd";
char *p, *t;
p = str1;
t = str2;
num = 0;
len = strlen(str1);
for(i = 0; i < len; i++)
{
h=0;
if(*p == 'a')
{
for(j = 0; j < 4; j++)
{
if(*(p++) == *(t++))
{
h++;
}
else
break;
}
t = str2;
if(h==4)
num++;
}
else
{
p++;
}
}
printf("%d\n", num);
}
改正RyeCatcher(The Catcher in the Rye)的。RyeCatcher中的程序,只要出现个a后,就会计1
现在改正后,必须严格匹配字符串才会加1的
Top
44 楼laolou_1983(太阳下山我下班)回复于 2006-03-21 15:53:17 得分 0
路过
学习
Top
45 楼skfox(sky)回复于 2006-03-21 16:09:55 得分 0
#include <stdio.h>
int CountInStr(char* strSrc,char* strSub)
{
if((strSrc==NULL)||(strSub==NULL))
return -1;
int nCount = 0;
char* pSrc = strSrc;
char* pSub = strSub;
while(*pSrc!='\0')
{
while(*pSrc++==*pSub++)
{
if(*pSub=='\0')
{
nCount++;
break;
}
if(*pSrc=='\0')
{
return nCount;
}
}
pSub = strSub;
}
return nCount;
}
int main()
{
int i = CountInStr("abcdnabcdmabcduabcdoabcdg","abcd");
printf("Count is %d\n",i);
return 1;
}Top
46 楼september__29( )回复于 2006-03-21 16:19:14 得分 0
字符串的模式匹配啊,Top
47 楼ls82930(疯狂教父)回复于 2006-03-21 16:25:09 得分 0
顺序匹配可以,但是时间复杂度比较高,可以用KMP算法,是线性级的!Top
48 楼notruiyi(什么乱七八糟的)回复于 2006-03-21 16:41:54 得分 0
KMP!一大串的垃圾代码,如果"aaaaa"里找"aaaa"有几个?Top
49 楼Athna(现在开始坠落)回复于 2006-03-21 16:50:10 得分 0
楼上的楼上的强
越改越长
RyeCatcher(The Catcher in the Rye)本来都不是最优算法,这样改下来的话是通俗易懂了。
还是6楼的int strstr_cnt(const char *string ,const char *substring)方法看起来比较精练些~~Top
50 楼Gemini2003(子由Pop)回复于 2006-03-21 16:50:47 得分 0
很少写代码~~学习学习
int substr(char *str1, char *str2)
{ int times=0;
int i=0;
int j=0;
while(i<strlen(str1))
{
if(str1[i]==str2[j])
{
i++;
j++;
if(str2[j]=='\0')
{
times+=1;
j=0;
}
}
else
{
i=i-j+1;
j=0;
}
}
return times;
}Top
51 楼wgjmail(笑面佛)回复于 2006-03-21 17:16:30 得分 0
两个错误:
1> p++; t=str2; 这里p能用p++,而要用 p= &str1[i]
2> if(j==3)判断条件不对,改成 if(j>3)Top
52 楼silence_jiliao(寂寥客)回复于 2006-03-21 17:43:07 得分 0
用C++可以么?
size_t count_num(const std::string &str1, const std::string &str2)
{
int idx = 0;
int size = 0;
while(((idx = str1.find(str2, idx)) != std::string::npos)){
idx += str2.size();
++size;
}
return size;
}Top
53 楼silence_jiliao(寂寥客)回复于 2006-03-21 17:52:26 得分 0
想了想,如果aaaaaaaaaaaaaaaaaaaaa查找aaa有几个的话
size_t count_num(const std::string &str1, const std::string &str2)
{
int idx = 0;
int size = 0;
while(((idx = str1.find(str2, idx)) != std::string::npos)){
idx ++;
++size;
}
return size;
}
Top
54 楼wofish2()回复于 2006-03-21 18:00:28 得分 0
我来一个,
int match(char *str1,char *str2) //察看str1中有几个str2
{
int count = 0;
int matchNO=0;
char* s1=str1;
char* s2=str2;
int long1 = strlen(s1);
int long2 = strlen(s2);
if (long1<long2)
{
return 0;
}
if (s1 == NULL || s2 == NULL)
{
return 0;
}
int str1length = 0;
while (str1length + long2 -1 <= long1)
{
if (*s1 == *s2)
{
s1++;
s2++;
matchNO++;
str1length++;
if (matchNO == 4)
{
count++;
matchNO = 0;
}
}
else
{
s2=str2;
s1++;
str1length++;
}
}
return count;
}
Top
55 楼objectprogram(星魂)回复于 2006-03-21 18:06:28 得分 0
華為的題目怎麼這麼簡單?Top
56 楼besthyq(寻欢醉一场,但愿长醉不愿醒!)回复于 2006-03-21 18:08:46 得分 0
jinjiajie(leorio)
int strstr_cnt(const char *string ,const char *substring)
{
int i,j,k,count=0;
for(i=0;string[i];i++)
for(j=i,k=0;string[j]==substring[k];j++,k++)
if(!substring[k+1])
count++;
return(count);
}
好简练。Top
57 楼Athna(现在开始坠落)回复于 2006-03-21 19:46:26 得分 0
char str1[]="aaaaaahaaaaaaahadsdhsaaaahsdaaaaaag";
char str2[]="aaaa";
如果程序改成这样的话?上面的有些程序可能就会出现问题!
希达人想出更好的解决方案Top
58 楼Athna(现在开始坠落)回复于 2006-03-21 20:04:22 得分 0
int strstr_cnt(const char *string ,const char *substring)
{
int i,j,k,count=0;
for(i=0;string[i];i++)
for(j=i,k=0;string[j]==substring[k];j++,k++)
if(!substring[k+1])
count++;
i=j;
return(count);
}
我挺的一个程序加了i=j后应该算漏洞少一些了
谁还想到这个程序的漏洞的话
拜托提一下~~
Top
59 楼lizi02(冬虫夏草)回复于 2006-03-21 21:33:11 得分 0
寻求最简单算法
本来很简单的题目,算法简单才是最重要的了Top
60 楼manplus(魅力加加)回复于 2006-03-21 21:39:44 得分 0
markTop
61 楼snnjx(nishuo)回复于 2006-03-21 22:01:51 得分 0
main()
{
char str1[]="abcdnabcdmabcduabcdoabcdgabcd";
char str2[]="abcd";
char *p = str1,*t = str2;
UInt32 inSPos = 0;
UInt32 inDPos = 0;
UInt32 u32Count = 0;
while (inSPos < strlen(str1) - strlen(str2) + 1)
{
UInt32 u32Start = inSPos;
for(UInt32 i = 0 ;i < strlen(str2) ; i++)
{
if (str1[u32Start + i] != str2[i])
{
inSPos++;
break;
}
}
if (i == strlen(str2))
{
u32Count ++;
inSPos += strlen(str2);
}
}
printf("\n Count = %d",u32Count);
return 0;
}
Top
62 楼snnjx(nishuo)回复于 2006-03-21 22:26:32 得分 0
上面的算法对 aaaa的这种字串是有问题的。不好意思,弄错了。
如果不讲求效率,可以直接回退stlen(str2)- 1个字符,但如果考虑效率,需要计算待比较字符的自身字串;也就是aaaa,需要回退3个字符,而abcd就不需要回退。这个算法可以参考数据结构书中的算法;
在不考虑效率的情况下,将代码修改如下,可以保证正确性;
if (i == strlen(str2))
{
u32Count ++;
inSPos ++;
}
Top
63 楼ruodeer(看我的个性签名都给我分)回复于 2006-03-21 22:34:46 得分 0
又见面试题Top
64 楼ybt631(默默耕耘!)回复于 2006-03-21 22:52:57 得分 0
//帖个强的。。。
char str1[]="abcdnabcdmabcduabcdoabcdgabcd";
char str2[]="abcd";
int *pInt2 = (int *)str2;
int *pInt1 =NULL;
char *pChar = str1;
int cnt =0;
//if(strlen(str1)<strlen(str2)) cnt =0;
do
{
pInt1 = (int *)(pChar);
if(*pInt1 == *pInt2) {cnt++;pChar +=4;}
else pChar++;
}while(*pChar);
cout<<cnt<<endl;Top
65 楼ybt631(默默耕耘!)回复于 2006-03-21 23:14:34 得分 0
改良一下可以适用所有的字符串匹配(在 n长字符串中找4长的字符串)
int *pInt2 = (int *)str2;
int *pInt1 =NULL;
char *pChar = str1;
int cnt =0;
int iStr1Length =strlen(str1);
if(iStr1Length <4)cnt =0;
else
{
do
{
pInt1 = (int *)(pChar);
if(*pInt1 == *pInt2) {cnt++;pChar +=4;}
else pChar++;
}while(pChar<str1+iStr1Length-4);
}
cout<<cnt<<endl;Top
66 楼sunwoods(sunwooos)回复于 2006-03-22 00:50:11 得分 0
#include "stdio.h"
#include "string.h"
/*******************************************
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
求str1中abcd出现的次数
********************************************/
void main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
char temp[5];
char *p;
int count = 0;
p = str1;
temp[4]='\0';
while( *(p+4) != '\0' )
{
memcpy(temp, p, 4);
if(0 == strcmp(str2, temp) )
{
count++;
}
p++;
}
printf("\r\nMatch string count is %d!\r\n",count);
return;
}Top
67 楼sghgcn()回复于 2006-03-22 07:45:25 得分 0
#include<string.h>
main()
{
char a[]="abcdababcsgegd";
char *p,q;
int i,s,t=0,y=0;
p=a;
s=strlen(a);
for(i=0;i<s;i++)
{
if((*p=='a')&&(*(p+1)=='b')&&(*(p+2)=='c')&&(*(p+3)=='d'))
t=t+1;
p++;
}
printf(""%d",t);
}
在TC 上运行过,绝对可靠!Top
68 楼RyeCatcher(The Catcher in the Rye)回复于 2006-03-22 10:32:19 得分 0
谢谢besthyq(寻欢醉一场,但愿长醉不愿醒!) ,我的代码确实存在问题~~Top
69 楼ENOUGH_XU(苦点,累点->没关系)回复于 2006-03-22 12:05:32 得分 0
其实,有一样东西是一样的,那就是算法.这个字符串的操作在数据结构书上有算法的优化和普通的算法.楼主应该好好看看啊.Top
70 楼lovevbnet(sdf)回复于 2006-03-22 14:38:24 得分 0
#include <iostream.h>
void main()
{
char szBuff[]="abcdacabcdefsabc";
char szFind[]="abcd";
cout<<szBuff<<endl<<szFind<<endl;
int count=0;
char *p,*t,*b;
p=szBuff;b=szBuff;
t=szFind;
while(*p)
{
if(*t=='\0')
{
count++;
b=p;
t=szFind;
}
if(*p==*t)
{
p++;
t++;
}
else
{
p=++b;
t=szFind;
}
}
if(*t=='\0')count++;
cout<<count<<endl;
}
Top
71 楼csy_2002()回复于 2006-03-22 20:40:24 得分 0
yangw150(永远超越) ( ) 信誉:100 2006-3-20 17:17:47 得分: 0
我得思路是每4个一比较,abcdnabcdmabcduabcdoabcdg这个字符串,前4个比较完后,第二次是从第二个到第5个,就是bcdn比较,依此类推,所以那个p++就是使指针指到下一个位置,因为赋初值的时候,p=str1,循环完一次后p=str1+1,指向字符b
我的,调试过了,不知道还有错不??
int strstr_count(const char *str1,const char *str2)
{
int j=0,i=0;
while(*str1)
{
i=0;
if(*str1!=*str2)
{
str1++;
}
while((*str1==*str2)&&*str1!='\0')
{str1++;str2++;i++;}
str2-=i;
if(i==((int)strlen(str2)))
j++;
}
return j;
}
Top
72 楼shimlyhyb()回复于 2006-03-22 22:08:56 得分 0
#include <iostream>
using namespace std;
/*char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
求str1中abcd出现的次数*/
int find(const char * src, const char * key)
{
char * p1 = (char*)src;
char * p2 = (char*)key;
int sums=0;
while(*p1)
{
if (0 == (strncmp(p1, p2, 4)))
{
sums++;
p1 += 4;
}
else
{
p1++;
}
}
return sums;
}
void main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int sums;
sums = find(str1, str2);
cout << sums << endl;
}
上面代码有缺陷,如果
是下面字符串:
char str1[]="ababaabadmabcduabcdoabcdg";
char str2[]="aba";
只能找到2个,但实际应该有3个,而且不好移植!Top
73 楼IhaveGotYou(扬扬)回复于 2006-03-22 23:40:09 得分 0
int getSubstingCount(char *sub,char *astr)
{
int count=0;
char *p=0;
if(sub==NULL||astr==NULL)
return -1;
while(*astr)
{ p=sub;
while(*p&&*p==*astr)
{
p++;
astr++;
}
if(!(*p)) count++;
astr++;
}
return count;
}Top
74 楼etflanker(天之痕)回复于 2006-03-22 23:59:23 得分 0
mark
Top
75 楼liumingqiang02(stavie)回复于 2006-03-23 08:48:57 得分 0
用数据结构上的经典字符串比较算法,而且书上已经给出代码了,稍微改动一下就行Top
76 楼lyszjs()回复于 2006-03-23 10:07:47 得分 0
markTop
77 楼yxf0605(菜鸟中的菜鸟)回复于 2006-03-23 11:06:50 得分 0
while((position=strstr(str1,str2)){count++;position=strstr(str1+position,str2);}
Top
78 楼mp6()回复于 2006-03-23 12:12:20 得分 0
markTop
79 楼Tangxiang(来,让我们一起跳舞吧。)回复于 2006-03-23 13:09:37 得分 0
数据结构上的KMP 算法实现……Top
80 楼bjstcm(快毕业了~~~)回复于 2006-03-23 13:10:18 得分 0
markTop
81 楼yangw150(永远超越)回复于 2006-03-23 15:12:42 得分 0
非常感谢各位高手鼎立相助,使我从各种不同的方法中受益匪浅,还有一个化为的题,我发了帖子,好像没人会做一样,大家帮我看看好吗?
1.struct bbb
{
long num;
char *pcname;
short sdate;
char cha[2];
short sba[6];
}*p;
p=0x100000;
p+0x1=0x____?
(unsigned long)p+0x1=0x___?
(unsigned long*)p+0x1=0x___?
(char*)p+0x1=0x___?
2.
struct tagabc
{ char cb;
short sc;
char cd;
long la;
}*pabc;
pabc=0x100000;
那么pabc+0x100=0x___?
(ulong)pabc+0x100=0x____?
(ulong*)pabc+0x100=____?
(char*)pabc+0x100=0x_____?
Top
82 楼IhaveGotYou(扬扬)回复于 2006-03-25 11:25:43 得分 0
我上面做的有误,现纠正一下:
int getSubstingCount(char *sub,char *astr)
{
int count=0;
char *p=0,*p2;
if(sub==NULL||astr==NULL)
return -1;
while(*astr)
{ p=sub;
p2=astr;
while(*p&&*astr&&*p==*astr)
{
p++;
astr++;
}
if(!(*p)) count++;
astr=p2+1;
}
return count;
}Top
83 楼zzr678()回复于 2006-03-28 22:49:38 得分 0
#include "iostream.h"
#include "stdio.h"
#include "string.h"
void main()
{
char str1[]="abcdnabcdmabcdabcabcdabcdddababcdnabcdabcd";
char str2[]="abcd";
char *p,*t;
int i,j,count=0,flag=0;
p=str1;
t=str2;
/////////////////////////////////////////////////////////////////////////////////////////
for(i=1;i<=strlen(str1)-strlen(str2)+1;i++)//比较次数
{
for(j=1;j<=strlen(str2);j++)//按单个字符匹配比较
{
if(*p==*t)
{ p++;
t++;
}
else
{
flag=0;//比较失败
break;
}
flag=1;//字符串完全匹配
}
if(flag==1){count++;}
p=p-j+2;//指针回溯
t=str2;
}
cout<<count<<endl;
}Top
84 楼systemx(-操!老子从不讲脏话的!阿弥陀佛!-)回复于 2006-03-29 11:00:13 得分 0
学习Top
85 楼jinjiajie(leorio)回复于 2006-03-29 11:10:11 得分 0
都是常识都是常识...怎么又顶上来了这贴...Top
86 楼beingstudio(郁郁仔)回复于 2006-03-29 21:34:40 得分 0
楼主 这么麻烦 你的KMP算法是怎么学的啊?
Top
87 楼flyoneq(﹏☆鰹繈d')回复于 2006-03-29 21:57:29 得分 0
我觉得大家好象都把这个题目搞复杂了,
其实好象只要比较那2个字符串然后设置一个变量统计比较相等的次数就行了。
用代码写也很简单的。Top
88 楼tudou_nuaa()回复于 2006-03-30 10:31:58 得分 0
int strstr_cnt(const char *string ,const char *substring)
{
int i,j,k,count=0;
for(i=0;string[i];i++)
for(j=i,k=0;string[j]==substring[k];j++,k++)
if(!substring[k+1])
count++;
return(count);
}
....这个题目出现n次了
为什么大家不多谈论一下写得这么简练的程序呢Top
89 楼iolia(爱欧里亚)回复于 2006-03-30 11:01:34 得分 0
为何小山坡的程序中要将const的类型强制转换?Top
90 楼FinlandRBT(芬兰兔子)回复于 2006-03-30 11:34:30 得分 0
p=0x100000; //p=(bbb*)0x100000;
p+0x1=0x____? 100018
(unsigned long)p+0x1=0x___? 100001
(unsigned long*)p+0x1=0x___? 100004
(char*)p+0x1=0x___? 100001
pabc+0x100=0x___? 100c00
(ulong)pabc+0x100=0x____? 100100
(ulong*)pabc+0x100=____? 100400
(char*)pabc+0x100=0x_____? 100100Top
91 楼magicianxcs()回复于 2006-03-30 11:38:40 得分 0
学习ing
现在面试怎么都要求重写c库函数啊Top
92 楼cnblackhawk(cnblackhawk)回复于 2006-03-30 13:19:41 得分 0
学习ingTop
93 楼cquazhi(阿志)回复于 2006-03-30 14:58:03 得分 0
看来 KMP算法 很重要的说!我最近在K 数据结构Top
94 楼zhengsen(三木君)回复于 2006-03-30 15:32:43 得分 0
有两种思路:
1,利用指针
2,利用数组Top
95 楼wu19821214(狗)回复于 2006-03-30 17:26:52 得分 0
我这也行,结果是5,不知道对不
#include<stdio.h>
#include<string.h>
void main()
{
int i,j;
int count=0;
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
for(i=0;i<(strlen(str1)-3);i++)
if(str1[i]=='a'&&str1[i+1]=='b'&&str1[i+2]=='c'&&str1[i+3]=='d')
{
++count;
}
printf("%d\n",count);
}Top
96 楼wucunfu(因为楼主你吝啬,所以我还是一个三角裤衩!)回复于 2006-03-31 01:35:20 得分 0
main()
{ char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
char *s1,*s2;
int i,j,k=0;
s1=str1;
s2=str2;
for(i=0;i<strlen(str1);i++)
{ if(*s1=='a')
{ for(j=0;j<4;j++)
{if (s1++==s2++)
{ ; }
}
s1++;
k+=1;
}
}
printf("\n%d",k);
}Top
97 楼zjf405()回复于 2006-04-01 02:11:09 得分 0
int strstr_cnt(const char *string ,const char *substring)
{
int i,j,k,count=0;
for(i=0;string[i];i++)
for(j=i,k=0;string[j]==substring[k];j++,k++)
if(!substring[k+1])
count++;
return(count);
}
....这个题目出现n次了
这个程序好象错了吧。当substring[k]='\0'时,内层循环就结束了根本不会执行下面的if语句,所以最后的count还是0根本没有自加Top
98 楼hansin(将冰山劈开)回复于 2006-04-01 11:07:35 得分 0
楼上的,程序是对的,我运行了,学习中Top
99 楼sniper1715(狙击手)回复于 2006-04-01 13:45:54 得分 0
这是我写的关于这个程序的代码:
#include "stdio.h"
#include "string.h"
int main()
{
char str1[]="abcdnabcdmabcduabcdoabcdg";
char str2[]="abcd";
int i,j,k,length;
k=0;
j=0;
length=strlen(str1);
for(i=0;i<=length-1;i++)
{
while(strcmp(str1[i],str2[j])==0)
{
j++;
if(j==3)
{
k++;
j=0;
break;
}
else
{
break;
j=0;
}
}
}
printf("%d\n",k);
return k;
}
Top




