C语言之求字符串的子串

Python022

C语言之求字符串的子串,第1张

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

char *sub(char *s,int st,int len)

{char *s1

 int i

 s1=(char*)malloc(len)

 for(i=0i<leni++)s1[i]=s[st+i-1]

 s1[i]='\0'

 return s1

}

int main()

{int n,i,j

 char s[200]

 scanf("%d%*c",&n)

 while(n--)

 {printf("input a string:")

  gets(s)

  printf("i=")

  scanf("%d",&i)

  printf("j=")

  scanf("%d%*c",&j)

  if(i+j>strlen(s))printf("Error\n")

    else printf("%s\n",sub(s,i,j))

 }

 return 0

}

char  *replace(char  *source,  char  *sub,  char  *rep) 

{ 

 char  *result 

 /*pc1  是复制到结果result的扫描指针*/

 /*pc2  是扫描 source 的辅助指针*/

 /*pc3  寻找子串时,为检查变化中的source是否与子串相等,是指向sub的扫描指针 */

 /*找到匹配后,为了复制到结果串,是指向rep的扫描指针*/

 char  *pc1,  *pc2,  *pc3 

 int  isource,  isub,  irep 

 isub  = strlen(sub)/*对比字符串的长度*/

 irep  = strlen(rep)/*替换字符串的长度*/

 isource= strlen(source) /*源字符串的长度*/ 

 if(NULL == *sub)

  return strdup(source) 

 /*申请结果串需要的空间*/

 result  = (char *)malloc(( (irep >isub) ? (float)strlen(source) / isub* irep+ 1:isource ) * sizeof(char))

 pc1  =  result/*为pc1依次复制结果串的每个字节作准备*/

 while(*source  !=  NULL) 

 { 

  /*为检查source与sub是否相等作准备,为pc2,pc3 赋初值*/

 pc2  =  source 

 pc3  =  sub

  /* 出循环的(任一)条件是: 

*  *pc2 不等于 *pc3 (与子串不相等) 

*  pc2  到源串结尾 

*  pc3  到源串结尾 (此时,检查了全部子串,source处与sub相等) 

*****************************************************/

 while(*pc2  ==  *pc3  &&  *pc3  !=  NULL  &&  *pc2  !=  NULL) 

 pc2++,  pc3++ [Page]

  /* 如果找到了子串,进行以下处理工作*/

 if(NULL  ==  *pc3) 

 { 

 pc3  =  rep 

/*将替代串追加到结果串*/

 while(*pc3  !=  NULL) 

 *pc1++  =  *pc3++ 

 pc2-- 

 source  =  pc2 

/* 检查 source与sub相等的循环结束后, 

* pc2 对应的位置是在 sub 中串结束符处。该是源串中下一个位置。 

* 将 source 指向其前面一个字符。 

***************************************************/

 } 

 else /*如果没找到子串,下面复制source所指的字节到结果串*/ 

 *pc1++ = *source 

 source++/* 将source向后移一个字符*/ 

 } 

 *pc1  =  NULL

 return  result

}

以下为测试代码:

int main()

{

  char s1[] ="abbccdfdcdbbdcd"

 char s2[]="dcd"

char s3[]="12345"

char *p = replace(s1,s2,s3)

printf("source=%s

",s1)

puts(s1)

  printf("sub = %s

",s2)

puts(s2)

  printf("replace string = %s",p)

return 0

}

三重循环即可

void print_all_sub(char *s)

{

    int i,j,k

    for(i = 0 s[i] i ++)//遍历每个元素。 

    {

        for(k=1 s[k+i-1] k ++)//计算以s[i]开始 长度为k的子串

        {

            for(j = 0 j<k j ++)//输出子串。 

            {

                printf("%c", s[i+j])

            }

            printf("\n")

        }

    }

}