#include <stdio.h> #include <string.h>//给出一个01字符串(长度不超过100),求其每一个子串出现的次数 void func(char str[],char t[],int l){//递归函数,数组t[]表示子串。开头为0的子串(及其递归后产生的串)永远要排在开头为1的子串(及其递归后产生的串) int sum=0; t[l]='0';t[l+1]='\0';//计算数组t下标为l的元素(即t[l])为'0'时,在str中出现的次数 if(strlen(t)==strlen(str))return;//递归边界 char *p=str; while(p=strstr(p,t)){ sum++; p=p+1; } if(sum>1)printf("%s %d\n",t,sum); func(str,t,l+1);//t串在递归中不断更新,核心是l变量不断加一 sum=0; t[l]='1';t[l+1]='\0';//计算数组t下标为l的元素(即t[l])为'1'时,在str中出现的次数 char *q=str; while(q=strstr(q,t)){ sum++; q=q+1; } if(sum>1)printf("%s %d\n",t,sum); func(str,t,l+1); } int main(){ char str[101],t[101];//数组t用来遍历所有可能出现的子串 while(scanf("%s",str)!=EOF){ func(str,t,0); } return 0; } //strstr(str1,str2)函数用于找到子串(str2)在一个字符串(str1)中第一次出现的位置,并返回该位置的指针;如果找不到,返回空指针(NULL)