使用C语言实现一个简单的密码字典生成器
- 介绍
- 递归生成字典函数
- 生日字典函数
- 主函数
- 运行样例展示
介绍
在密码长度固定时,用简单的多重循环很容易就实现密码字典的生成,但是当密码长度较长或者密码长度不固定时,这种多重循环很难完成我们的需求了,遇到这样的问题,应该就需要交给递归了,这篇文章所描述的密码字典生成器就是利用递归算法来实现的。后来又增加了生日密码模式的功能,虽然这个功能很简陋,但也使其功能得以拓展。
递归生成字典函数
定义了全局变量来记录字典空间,利用递归算法实现了密码字典的生成。
#include<stdio.h>int n=0,l,flag=0;
int min,max;
char p[10];print(int n,int l,FILE* pf)
{int j;if(n==l){fprintf(pf,"%s\n",p);flag++;return;}for(j=min;j<=max;j++){p[n]=(char)j;print(n+1,l,pf);}
}
生日字典函数
简单的闰年判断和月份日期遍历。
printday(int ymin,int ymax,FILE* pf)
{int y,m,d,dmax;for(y=ymin;y<=ymax;y++){for(m=1;m <= 12;m++){if(m==4||m==6||m==9||m==11)dmax=30;else if(m==2 && ((y%4==0&&y%100!=0)||y%400==0)==1)dmax=29;else if(m==2 && ((y%4==0&&y%100!=0)||y%400==0)==0)dmax=28;elsedmax=31;for(d=1;d<=dmax;d++){fprintf(pf,"%04d%02d%02d\n",y,m,d);flag++;}}}
}
主函数
这一部分主要实现了功能的选择以及对一些参数的初始化设置。
int main()
{int s1,s2;int ymin,ymax; FILE* pf = fopen("dict.txt", "w");printf("请选择字典模式:\n");printf("1:字符串字典 2:生日字典\n");scanf("%d",&s1);if(s1==1){printf("请输入字符串长度:\n");scanf("%d",&l);printf("请选择基础字符:\n");printf("1:大写字母 2:小写字母 3:数字\n");scanf("%d",&s2);if(s2==1)min=65, max=90;else if(s2==2)min=97, max=122;elsemin=48, max=57;printf("正在执行,请稍候...\n");print(n,l,pf);}else{printf("请输入初始年份:\n");scanf("%d",&ymin);printf("请输入终止年份:\n");scanf("%d",&ymax);printf("正在执行,请稍候...\n");printday(ymin,ymax,pf);} printf("执行成功,字典空间为%d",flag);return 0;
}
运行样例展示