#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
/*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")
}
}
}