86.八千万qq密码按相似度排序并统计密码出现次数,生成密码库

  • 存储qq的文件地址以及按照密码相似度排序的文件地址
    1 //存储qq的文件的地址
    2 char path[512] = "QQ.txt";
    3 //按照密码相似度排序的文件地址
    4 char pathsortbypass[512] = "QQpasswordsort.txt";

     

  • 标识qq一共有多少行
    1 //文件一共有多少行
    2 #define N  84331446

     

  • 创建结构体存储密码,并把文件载入内存
    1 //密码信息
    2 struct info
    3 {
    4     char str[17];
    5 };
    6 
    7 //指向所有结构体的指针
    8 struct info *pall = NULL;
     1 //初始化
     2 void init()
     3 {
     4     //记录时间
     5     time_t start, end;
     6     time(&start);
     7 
     8     pall = calloc(N, sizeof(struct info));//分配内存
     9     if (pall==NULL)
    10     {
    11         puts("calloc fail");
    12         return;
    13     }
    14     //打开文件
    15     FILE *pf = fopen(path, "r");
    16     
    17     //依次读取
    18     for (int i = 0; i <N; i++)
    19     {
    20         char str[50] = { 0 };
    21         fgets(str, 50, pf);
    22         char *pfind = strstr(str, "----");
    23         //每行格式123----qweqe
    24         if (pfind !=NULL)
    25         {
    26             int length = strlen(pfind + 4);
    27             //刷掉非法密码
    28             if (length<17)
    29             {
    30                 //拷贝字符串
    31                 strcpy(pall[i].str, pfind + 4);
    32             }
    33         }
    34     }
    35     //关闭文件
    36     fclose(pf);
    37     time(&end);
    38     printf("文件读取话费%f秒\n", difftime(end, start));
    39 }

     

  • 按照相似度快速排序
     1 //快速排序比较函数,比较两个结构体
     2 int com(void *p1, void *p2)
     3 {
     4     struct info *pinfo1 = p1;
     5     struct info *pinfo2= p2;
     6     return strcmp(pinfo1->str, pinfo2->str);//排序的函数
     7 }
     8 
     9 //排序
    10 void sort()
    11 {
    12     //记录时间
    13     time_t start, end;
    14     time(&start);
    15 
    16     //快速排序
    17     qsort(pall, N, sizeof(struct info), com);
    18 
    19     time(&end);
    20     printf("排序话费%f秒\n", difftime(end, start));
    21 }

     

  • 写入文件
     1 //写入文件
     2 void writetofile()
     3 {
     4     //存储时间
     5     time_t start, end;
     6     //开始时间
     7     time(&start);
     8     //以写的方式打开文件
     9     FILE *pf = fopen(pathsortbypass, "w");
    10     //判断每一个
    11     for (int  i = 0; i < N; i++)
    12     {
    13         //格式 5----pass
    14         char allstr[100] = { 0 };
    15         //存储密码
    16         char istr[100] = { 0 };
    17         strcpy(istr, pall[i].str);//拷贝备份
    18 
    19         int j = 1;//出现一次
    20         //循环直到最后一个不相等
    21         while (strcmp(pall[i].str,pall[i+1].str)==0)
    22         {
    23             i++;//循环前进
    24             j++;//计数
    25         }
    26         //合成字符串写入
    27         sprintf(allstr, "%d----%s", j, istr);
    28         //写入到文件
    29         fputs(allstr, pf);
    30     }
    31 
    32     //关闭文件
    33     fclose(pf);
    34 
    35     //结束
    36     time(&end);
    37 
    38     printf("排序花费%f秒\n", difftime(end, start));
    39 }

     

  • 获取文件有多少行
     1 //获取文件有多少行
     2 int getN(char *path)
     3 {
     4     int i = 0;
     5     FILE *pf = fopen(path, "r");
     6     if (pf==NULL)
     7     {
     8         return -1;
     9     }
    10     else
    11     {
    12         while (!feof(pf))
    13         {
    14             char str[50] = { 0 };
    15             fgets(str, 50, pf);
    16             i++;
    17         }
    18         
    19         fclose(pf);
    20         return i;
    21     }
    22 }

     

  • 主函数
     1 //主函数
     2 void main()
     3 {
     4     //初始化载入到内存
     5     init();
     6     //密码相似度排序
     7     sort();
     8     //写入文件
     9     writetofile();
    10     system("pause");
    11 }

     

完整代码

  1 #define  _CRT_SECURE_NO_WARNINGS
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 #include<time.h>
  6 
  7 //存储qq的文件的地址
  8 char path[512] = "QQ.txt";
  9 //按照密码相似度排序的文件地址
 10 char pathsortbypass[512] = "QQpasswordsort.txt";
 11 //文件一共有多少行
 12 #define N  84331446
 13 
 14 //密码信息
 15 struct info
 16 {
 17     char str[17];
 18 };
 19 
 20 //指向所有结构体的指针
 21 struct info *pall = NULL;
 22 
 23 //写入文件
 24 void writetofile()
 25 {
 26     //存储时间
 27     time_t start, end;
 28     //开始时间
 29     time(&start);
 30     //以写的方式打开文件
 31     FILE *pf = fopen(pathsortbypass, "w");
 32     //判断每一个
 33     for (int  i = 0; i < N; i++)
 34     {
 35         //格式 5----pass
 36         char allstr[100] = { 0 };
 37         //存储密码
 38         char istr[100] = { 0 };
 39         strcpy(istr, pall[i].str);//拷贝备份
 40 
 41         int j = 1;//出现一次
 42         //循环直到最后一个不相等
 43         while (strcmp(pall[i].str,pall[i+1].str)==0)
 44         {
 45             i++;//循环前进
 46             j++;//计数
 47         }
 48         //合成字符串写入
 49         sprintf(allstr, "%d----%s", j, istr);
 50         //写入到文件
 51         fputs(allstr, pf);
 52     }
 53 
 54     //关闭文件
 55     fclose(pf);
 56 
 57     //结束
 58     time(&end);
 59 
 60     printf("排序花费%f秒\n", difftime(end, start));
 61 }
 62 
 63 
 64 //快速排序比较函数,比较两个结构体
 65 int com(void *p1, void *p2)
 66 {
 67     struct info *pinfo1 = p1;
 68     struct info *pinfo2= p2;
 69     return strcmp(pinfo1->str, pinfo2->str);//排序的函数
 70 }
 71 
 72 //排序
 73 void sort()
 74 {
 75     //记录时间
 76     time_t start, end;
 77     time(&start);
 78 
 79     //快速排序
 80     qsort(pall, N, sizeof(struct info), com);
 81 
 82     time(&end);
 83     printf("排序话费%f秒\n", difftime(end, start));
 84 }
 85 
 86 //初始化
 87 void init()
 88 {
 89     //记录时间
 90     time_t start, end;
 91     time(&start);
 92 
 93     pall = calloc(N, sizeof(struct info));//分配内存
 94     if (pall==NULL)
 95     {
 96         puts("calloc fail");
 97         return;
 98     }
 99     //打开文件
100     FILE *pf = fopen(path, "r");
101     
102     //依次读取
103     for (int i = 0; i <N; i++)
104     {
105         char str[50] = { 0 };
106         fgets(str, 50, pf);
107         char *pfind = strstr(str, "----");
108         //每行格式123----qweqe
109         if (pfind !=NULL)
110         {
111             int length = strlen(pfind + 4);
112             //刷掉非法密码
113             if (length<17)
114             {
115                 //拷贝字符串
116                 strcpy(pall[i].str, pfind + 4);
117             }
118         }
119     }
120     //关闭文件
121     fclose(pf);
122     time(&end);
123     printf("文件读取话费%f秒\n", difftime(end, start));
124 }
125 
126 
127 //获取文件有多少行
128 int getN(char *path)
129 {
130     int i = 0;
131     FILE *pf = fopen(path, "r");
132     if (pf==NULL)
133     {
134         return -1;
135     }
136     else
137     {
138         while (!feof(pf))
139         {
140             char str[50] = { 0 };
141             fgets(str, 50, pf);
142             i++;
143         }
144         
145         fclose(pf);
146         return i;
147     }
148 }
149 
150 
151 //主函数
152 void main()
153 {
154     //初始化载入到内存
155     init();
156     //密码相似度排序
157     sort();
158     //写入文件
159     writetofile();
160     system("pause");
161 }

 

posted @ 2018-02-22 10:45  喵小喵~  阅读(587)  评论(0编辑  收藏  举报