#include <stdio.h>
double pow(double x,double y);
void Clean(char *cArray, int iBit);
int Bits(char *cArray);
void Generic(int iAssign,int iBit,int iSourceMax,char *cSources,char *cStrings);
int main()
{
//cStrings保存即将生成的字符串,cSources表示源字符串,即生成的字典中包含哪些字符
char cStrings[10],cSources[100];
//iBitMax表示生成字典的最大位数
//iSourceMax表示源字符串包含的字符数
//iBitNow表示目前生成的是多少位的字符串
//iAssign表示目前是第多少次生成,详情见图
int iBitMax,iSourceMax,iBitNow,iAssign;
//fFileName保存文件名
char fFileName[50];
FILE *file;
printf("输入要保存的文件名:");
fgets(fFileName,50,stdin); //输入文件名
Bits(fFileName); //用来去掉fgets产生的回车符号,见Bits函数
if((file = fopen(fFileName,"w")) == NULL)
{
printf("文件创建失败!\n");
return 1; //出现问题,退出
}
printf("输入位数:");
scanf("%d",&iBitMax);
getchar(); //吸收scanf产生的回车符号,以免在下面的fgets中出现问题
printf("输入源字符串:");
fgets(cSources,100,stdin);
iSourceMax = Bits(cSources); //获得源字符串的大小
for(iBitNow=1;iBitNow<=iBitMax;iBitNow++) //按生成位数进行递增
{
for(iAssign=0;iAssign<(int)pow((double)iSourceMax,(double)iBitNow);iAssign++) //按第多少次生成进行递增
{
Generic(iAssign,iBitNow-1,iSourceMax,&cSources[0],&cStrings[0]);
fputs(cStrings,file);
fputc('\n',file);
Clean(cStrings,10);
}
}
fclose(file);
return 0;
}
//清除一个字符串的内容
void Clean(char *cArray, int iBit)
{
int i;
for(i=0;i<iBit;i++)
{
*(cArray+i) = '\0';
}
}
//探测字符串长度,并把最后的回车符号变成空字符
int Bits(char *cArray)
{
int i=0;
while(1)
{
if((*(cArray+i) == '\n')||(*(cArray+i) == '\0'))
{
*(cArray+i) = '\0';
break;
}
i++;
}
return i;
}
//根据传入的数据生成一个字符串,需要传入源字符串数组指针
void Generic(int iAssign,int iBit,int iSourceMax,char *cSources,char *cStrings)
{
int iPow = 1;
for(iBit;iBit>=0;iBit--)
{
//将源字符串中的字符分别赋给目标字符串,方法见图
*(cStrings+iBit) = *(cSources+(iAssign/iPow)%iSourceMax);
iPow = iPow*iSourceMax;
}
}
//x的y次方函数实现
double pow(double x,double y)
{
int i;
double result=1;
if(x <= 0)
{
return -1;
}
for(i=0;i<(int)y;i++)
{
result = result*x;
}
return result;
}
如,输入位数:3 输入源字符串:0123,则可以输出如下字典:
0
1
2
3
00
01
02
03
10
11
……
一些基本思路:
下面这张图片大概是上图生成值的大致方法吧……