c语言查找并输出重复字符串

要求:在一大串无序字符串中,查找所有重复的字符串,注意是所有!并输出所有这些字符串和重复的个数。无序字符串个数可能在1000以上。重复的单字符不算在内。举例:abc124... 要求:在一大串无序字符串中,查找所有重复的字符串,注意是所有!并输出所有这些字符串和重复的个数。无序字符串个数可能在1000以上。重复的单字符不算在内。
举例:abc1243128129a343abc
则要输出:
abc 2(ab,bc不用再输出)
12 3
43 2
我的财富不多,但求来个真正的大神!
我想了很久都没想出来!
给出整篇代码(加注释),我会验证的!
展开
 我来答
百度网友b7c2054
推荐于2017-12-16 · TA获得超过284个赞
知道小有建树答主
回答量:293
采纳率:50%
帮助的人:206万
展开全部
//#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include<stdlib.h>
void stringsort(char(*p)[1000], int m) // 排列字符串,长的字符串在前面,短的在后面。
{
 int i, j;
 char c[1024];
 for (i = 0; i < m-1; i++)
 {
  for (j = 0; j < m - 1 - i; j++)
   if (strlen(p[j]) < strlen(p[j + 1]))
   {
   strcpy(c, p[j]);
   strcpy(p[j], p[j + 1]); 
   strcpy(p[j + 1], c);
   }
 }
}
int substr(char *str, char *p)  //判断 p是否是str的字串,是的话返回1,不是返回0
{
 int i, j;
 for (i = 0; str[i]; i++)
 {
  for (j = 0; str[i] == p[j] && p[j]; i++, j++);
  if (p[j] == 0)
  {
   return 1;
  }
  if (j != 0)
  {
   i--;
  }
 }
 return 0;
}
int main(void)
{
 char str[1000] = "abc1243128129a343abc";
 char  ss[1024] = {0};  //放子串的临时数组
 char ss1[1000][1000];  //所有长度大于1的子串放入这里
 int m = 0;            //子串的个数
 int a[1024] = { 0 };   //统计子串的个数的数组
 int i, j;
 for ( i = 0; str[i]; i++)
 {
  memset(ss, 0, 1024);
  int k = 0;
  ss[k++] = str[i];
  for ( j = i + 1; str[j]; j++)
  {
   ss[k++] = str[j];
   strcpy(ss1[m++], ss);
  }
  
 }
 //上面这段程序是找出字符串长度大于1的所有子串
 
 stringsort(ss1, m);  //把这些字串按长度放入ss1中,长的在前面,短的在后面
 
 for ( i = 0; i < m; i++)
 {
 
  char *p =str;
  while ((p = strstr(p, ss1[i])) != NULL)
  {
   a[i] ++;
   p = p + strlen(ss1[i]);
  }
 }//   这段程序是找到每一个子串出现的次数,并放入a数组中
 
 for ( i = 0; i < m; i++)
 {
  int  flag = 0;  //标记符
  for ( j = 0; j < i; j++) 
  {
   if (substr(ss1[j], ss1[i]) && a[j]==a[i])  //比如abc出现了三次,而bc出现三次,那么只输出abc的次数
   {
    flag = 1;
   }
        
  }
  if (a[i]>1 && flag == 0)
  printf("%s:%d\n", ss1[i], a[i]);
 }
 
 //system("pause");
 
 return 0;

//写了一晚上,真是不容易啊

更多追问追答
追问
你的程序不行。我随便测试了一个字符串:
americawehavecomesofarwehaveseensomuchbutthereissomuchmoretodosotonightletusaskourselves(88个)程序就崩溃了。在vc++6.0和vs2015上都是这样。
有的时候没崩溃但却不能输出。
你的程序对大点的字符串没有作用。
再改改吧......
追答

因为你的字符串比较长了,所以子串就多了,我这里子串的个数限制在了1000个,所以把数组的长度变长一点就可以了,而且要放到全局数组才行,因为在栈上的数组超过1000估计就挂了,像这样就行了,我定义成100000这样就能装下了

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式