72.挖掘CSDN密码到链表并统计密码出现次数生成密码库

  • list.h

    1 1 #define _CRT_SECURE_NO_WARNINGS 2 2 #include <stdio.h> 3 3 #include <stdlib.h> 4 4 #include <string.h> 5 5 6 6 //创建密码结点 7 7 typedef struct passinfo 8 8 { 9 9 //密码 1010 char password[20]; 1111 //出现次数 1212 int ci; 1313 //下一个节点 1414 struct passinfo *pNext; 1515 }INFO, *PINFO; 1616 1717 //头部插入 1818 PINFO addback(PINFO phead, char password[20]); 1919 //按照次数排序 2020 PINFO sortbyci(PINFO phead); 2121 //按照密码排序 2222 PINFO sortbypass(PINFO phead); 2323 //显示数据 2424 PINFO show(PINFO phead); 2525 //判断存在与否 2626 int isin(PINFO phead, char password[20]); 2727 //写入到文件 2828 void writetofile(PINFO phead, char path[100]);
  • list.c

    1 1 #include "list.h" 2 2 3 3 //头部插入 4 4 PINFO addback(PINFO phead, char password[20]) 5 5 { 6 6 //开辟内存 7 7 PINFO pnew = calloc(1, sizeof(INFO)); 8 8 //拷贝密码 9 9 strcpy(pnew->password, password); 10 10 //初始化 11 11 pnew->ci = 1; 12 12 pnew->pNext = NULL; 13 13 //如果头结点为空直接插入 14 14 if (phead ==NULL) 15 15 { 16 16 phead = pnew; 17 17 } 18 18 //否则头部插入 19 19 else 20 20 { 21 21 pnew->pNext = phead; 22 22 phead = pnew; 23 23 } 24 24 return phead; 25 25 } 26 26 27 27 //按照密码次数排序 28 28 PINFO sortbyci(PINFO phead) 29 29 { 30 30 //冒泡排序法,一共冒泡这么多次 31 31 for (PINFO p1 = phead; p1 != NULL;p1=p1->pNext) 32 32 { 33 33 for (PINFO p2 = phead; p2 != NULL; p2 = p2->pNext) 34 34 { 35 35 if (p2->pNext!=NULL) 36 36 { 37 37 //如果次数小则进行交换 38 38 if (p2->ci < p2->pNext->ci) 39 39 { 40 40 //交换数据 41 41 int citemp = p2->ci; 42 42 p2->ci = p2->pNext->ci; 43 43 p2->pNext->ci = citemp; 44 44 45 45 char passtemp[100]; 46 46 strcpy(passtemp, p2->password); 47 47 strcpy(p2->password, p2->pNext->password); 48 48 strcpy(p2->pNext->password, passtemp); 49 49 } 50 50 } 51 51 } 52 52 } 53 53 } 54 54 55 55 //按照密码排序 56 56 PINFO sortbypass(PINFO phead) 57 57 { 58 58 //冒泡排序 59 59 for (PINFO p1 = phead; p1 != NULL; p1 = p1->pNext) 60 60 { 61 61 for (PINFO p2 = phead; p2 != NULL; p2 = p2->pNext) 62 62 { 63 63 if (p2->pNext != NULL) 64 64 { 65 65 if (strcmp(p2->password, p2->pNext->password) < 0) 66 66 { 67 67 //交换数据 68 68 int citemp = p2->ci; 69 69 p2->ci = p2->pNext->ci; 70 70 p2->pNext->ci = citemp; 71 71 72 72 char passtemp[100]; 73 73 strcpy(passtemp, p2->password); 74 74 strcpy(p2->password, p2->pNext->password); 75 75 strcpy(p2->pNext->password, passtemp); 76 76 77 77 } 78 78 } 79 79 } 80 80 } 81 81 } 82 82 83 83 //显示数据 84 84 PINFO show(PINFO phead) 85 85 { 86 86 if (phead==NULL) 87 87 { 88 88 return; 89 89 } 90 90 else 91 91 { 92 92 printf("%s,%d\n", phead->password, phead->ci); 93 93 show(phead->pNext); 94 94 } 95 95 return phead; 96 96 } 97 97 98 98 //判断密码是否存在 99 99 int isin(PINFO phead, char password[20]) 100100 { 101101 PINFO p = phead; 102102 while (p!=NULL) 103103 { 104104 if (strcmp(p->password,password)==0) 105105 { 106106 p->ci += 1; 107107 return 1; 108108 } 109109 p = p->pNext; 110110 } 111111 112112 return 0;//不在链表内部 113113 } 114114 115115 //写入到文件 116116 void writetofile(PINFO phead, char path[100]) 117117 { 118118 FILE *pf = fopen(path, "w"); 119119 PINFO p = phead; 120120 while (p != NULL) 121121 { 122122 //格式化打印到文件 123123 fprintf(pf, "%s %d\n", p->password, p->ci); 124124 p = p->pNext; 125125 } 126126 fclose(pf); 127127 }
  • main.c

    1 1 #include "list.h" 2 2 #include <Windows.h> 3 3 PINFO phead = NULL; 4 4 5 5 //是否满足格式要求 账号 # 密码 # 邮箱 6 6 int isoktosscanf(char *str) 7 7 { 8 8 //判断是否存在# 9 9 char *p = strstr(str, "#"); 1010 if (p!=NULL) 1111 { 1212 //继续判断是否存在第二个# 1313 if (strstr(p+1,"#")!=NULL) 1414 { 1515 return 1; 1616 } 1717 else 1818 { 1919 return 0; 2020 } 2121 } 2222 else 2323 { 2424 return 0; 2525 } 2626 } 2727 2828 //消除空格 2929 void eatspace(char *str) 3030 { 3131 //当前位置 3232 int i = 0; 3333 //游标 3434 int j = 0; 3535 //双指针错位 3636 while ((str[i]=str[j++])!='\0') 3737 { 3838 if (str[i]!=' ') 3939 { 4040 i++; 4141 } 4242 } 4343 } 4444 4545 //文件载入 4646 void fileload() 4747 { 4848 //打开文件 4949 FILE *pf = fopen("csdn.txt", "r"); 5050 5151 //如果没有到文件末尾 5252 while (!feof(pf)) 5353 { 5454 char str[100] = { 0 }; 5555 char password[100] = { 0 }; 5656 //从文件中获取一行 5757 fgets(str, 100, pf); 5858 //找到第一个#的位置 5959 char*p1 = strstr(str, "#"); 6060 //找到第二个#的位置 6161 char*p2 = strstr(p1+1, "#"); 6262 //分别设置成'\0' 6363 *p1 = '\0'; 6464 *p2 = '\0'; 6565 //拷贝字符串 6666 strcpy(password, p1 + 1); 6767 //消除空格 6868 eatspace(password); 6969 //判断是否在链表中 7070 if (isin(phead, password) == 0) 7171 { 7272 //添加到头结点 7373 phead = addback(phead, password); 7474 } 7575 } 7676 fclose(pf); 7777 7878 //按密码次数排序 7979 sortbyci(phead); 8080 //写入到文件 8181 writetofile(phead, "C:\\ci.txt"); 8282 //按照密码相似度排序 8383 sortbypass(phead); 8484 //写入到文件 8585 writetofile(phead, "C:\\pass.txt"); 8686 } 8787 8888 //main函数 8989 void main4() 9090 { 9191 fileload(); 9292 system("pause"); 9393 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )