CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

大家看看这个华为的题怎么作,关于字符串的

楼主yangw150(永远超越)2006-03-20 16:05:42 在 C/C++ / C语言 提问

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

相关问题

  • 一道华为公司的面试题目.怎么把字符串转化为字节数组?
  • 一道华为公司的面试题目.怎么把字符串转化为字节数组?
  • 字符串问题
  • 字符串问题?
  • 字符串问题;
  • 字符串问题
  • 字符串问题
  • 字符串问题
  • 字符串问题
  • 字符串问题

关键词

  • c++
  • 代码
  • abcdnabcdmabcduabcdoabcdg
  • abcd
  • str
  • 字符串
  • strlen
  • idx
  • substringcount
  • psub

得分解答快速导航

  • 帖主:yangw150
  • RyeCatcher
  • yleiou
  • zyfhfx
  • besthyq

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo