⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 生成密码字典的c语言源代码.txt

📁 c语言的一些常见的算法以及思考和改进的文章,写的很不错,花费了很大的精力从网络了搜罗的,希望大家喜欢.
💻 TXT
字号:
生成密码字典的C语言源代码[原创] 
         其实,也没有用什么高深的知识。首先给定在密码中可能会出现的字符,然后从n个字符中取r个字符的排列,就可以生成简单的密码字典了。在本程序中,是先从n个字符中选取r个字符的组合,然后再计算r个字符的全排列。有点麻烦了,但是对于理解密码字典的制作原理,应该是足够了。

#i nclude <ctype.h>

int n;
char a[68];/*存放可能的密码*/
int cankao[68];/*求排列时用*/
int go_on;/*排列结束标志*/
void main(int argc,char *argv[])
{
   char array[68]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789,.;'!#";/*可能的字符*/
   int i;
   void first(char *,int,int);
   void fun(char *,int,int);
   void usage();
   int flag=0;
   if(argc==1)  /*下面几个都是控制程序用法的*/
      usage();
   if(strcmp(argv[1],"/L")!=0&&strcmp(argv[1],"/l")!=0&&strcmp(argv[1],"/M")!=0&&strcmp(argv[1],"/m")!=0)
      usage();
   for(i=2;i<argc;i++)
     if(strlen(argv[i])!=1||isdigit(argv[i][0])!=1)
       flag=1;
   if(flag==1)
      usage();
   if(strcmp(argv[1],"/L")==0||strcmp(argv[1],"/l")==0)
   {
      if(argc>4||argv[2][0]>argv[3][0])
      {    usage();exit(-1);}
      first(array,argv[2][0]-'0',argv[3][0]-'0');
   }
   else if(strcmp(argv[1],"/M")==0||strcmp(argv[1],"/m")==0)
   {
      for(i=2;i<argc;i++)
      {
            n=argv[i][0]-'0';
            fun(array,67,n);
      }
   }
}

void first(char array[],int start,int end)
{
   int i,j;
   for(i=start;i<=end;i++)
   {
      for(j=0;j<68;j++)
             a[j]=0;
      n=i;
      fun(array,67,i);
   }
}

void sort(int arr[],int start,int end)
{ /*排序,求全排列用*/
   int i,j;
   for(i=start;i<end;i++)
     for(j=start;j<end;j++)
       if(arr[j]>arr[j+1])
       {
          int t=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=t;
       }
}

int next(int arr[],int end)
{  /* 用来求下一个排列*/
  int i,j;
  int temp;
  for(i=end-2;i>=0;i--)
    if(arr[i]<arr[i+1])
      break;
  for(j=end-1;j>i;j--)
    if(arr[j]>arr[i])
      break;
  if(j==i)
  {  go_on=0; return;}/*求排列结束*/
  temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
  sort(arr,i+1,end);
}

void output()
{
   int i;
   for(i=0;i<78;i++)
      if(i<=n)
  cankao[i]=i;
      else
  cankao[i]=0;
   go_on=1;
   while(go_on==1)
   {
     next(cankao,n);
     for(i=0;i<=n;i++)
       printf("%c",a[cankao[i]]);
     printf("\n");
   }
}

void fun(char array[],int m,int k)
{/*求组合*/
   int i,j;
   for(i=m;i>=k;i--)
   {
      a[k-1]=array[i];
      if(k>1)
            fun(array,i-1,k-1);
      else
      {
           output();
      }
   }
}

void usage()
{
   printf("\nUSAGE:");
   printf("\n(1)mimac /M 4 6 8");
   printf("\nor\n(2)mimac /L 4 8");
   printf("\nor\n(3)mimac /L 4 8 >file.txt\n");
}

这个代码本来还有点问题,所以我加了密码隐藏起来,今天想了一下,就不修改了,算是给朋友们一个发挥的余地吧,而是另外写了一个BCB的版本,可以使用的BCB代码可以参考下面的连接:

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -