86.八千萬qq密碼按相似度排序並統計密碼出現次數,生成密碼庫
阿新 • • 發佈:2018-02-22
關閉 tdi 文件的 寫入文件 spa body qsort def string
- 存儲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 //
- 按照相似度快速排序
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 }
86.八千萬qq密碼按相似度排序並統計密碼出現次數,生成密碼庫