49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序
原数据:
处理后的数据:
完整代码:
1 //思路; 2 //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据赋给结构体 3 4 #define _CRT_SECURE_NO_WARNINGS 5 #include <iostream> 6 #include <stdlib.h> 7 #include <string.h> 8 9 //要被挖掘的数据 10 char str[1024] = "569603080----zj123456789 \ 11 94940443----zj123456789 \ 12 260024036----zj1456789 \ 13 707611428----zj123456789 \ 14 793516568----zj123456789 \ 15 280105138----zj1256789 \ 16 853339297----zj145678 \ 17 791088021----zj1234789 \ 18 461913547----zj12366456789 \ 19 739195069----zj12389 \ 20 595061094----zj123789 \ 21 835928755----zj123456789 \ 22 824218951----zj123456789 \ 23 824219738----zj123456789 \ 24 824220392----zj16789 \ 25 793708834----zj123456789 \ 26 462942630----zj1789 \ 27 779446648----zj1256789 \ 28 807517937----zj123456789 \ 29 785332401----zj123456789 \ 30 824637233----zj123456789 \ 31 824637654----zj126789 \ 32 824642464----zj123456789 \ 33 657004476----zj123456789 \ 34 550261273----zj16789 \ 35 771451402----zj123456789 \ 36 478838706----zj123456789 \ 37 837569545----zj12345789 \ 38 838778566----zj12789 \ 39 838466198----zj126789 \ 40 807522015----zj1236789 \ 41 823194447----zj12789 \ 42 295936400----zj123456789 \ 43 838041792----zj1239 \ 44 838042137----zj123456789 \ 45 838042825----zj1289 "; 46 47 //求出数据长度 48 int totalLength; 49 50 //获取有多少行数据 51 int getlength(char *src) 52 { 53 int num = 0; 54 char *pstart = strstr(src, "----"); 55 56 while (pstart != NULL) 57 { 58 num++; 59 pstart = strstr(pstart+4, "----"); 60 } 61 return num; 62 } 63 64 //QQ号结构体 65 struct QQ 66 { 67 long long qqNum; 68 char *mima; 69 }; 70 71 //匿名结构体存储所有QQ 72 struct 73 { 74 struct QQ *data; 75 int length; 76 }MyData; 77 78 //数据清洗,把空格替换成‘\0’ 79 void wash(char *src) 80 { 81 while (*src != '\0') 82 { 83 if (*src == ' ') 84 { 85 *src = '\0'; 86 } 87 src++; 88 } 89 } 90 91 //初始化结构体 92 void init() 93 { 94 //给匿名结构体分配内存 95 MyData.data = (struct QQ *)calloc(MyData.length, sizeof(struct QQ)); 96 97 //MyData.data的下标 98 int id = 0; 99 //把清洗后的数据从第一位遍历到最后一位 100 for (char *pstart = str; pstart < str + totalLength; pstart += strlen(pstart)+1) 101 { 102 //以“-----”寻找,返回寻找到的首地址 103 char *pwei = strstr(pstart,"----"); 104 //密码所在位置的首地址 105 pwei += 4; 106 //获取密码长度 107 int len = strlen(pwei); 108 //精确分配内存 109 MyData.data[id].mima = (char *)calloc(len+1, sizeof(char)); 110 111 //以此方法精确拷贝 112 //sscanf(pstart, "%lld----%s", &MyData.data[id].qqNum,MyData.data[id].mima); 113 //或者以这种方式copy数据 114 sscanf(pstart, "%lld",&MyData.data[id].qqNum); 115 strcpy(MyData.data[id].mima, pwei); 116 //printf("%lld,%s\n", MyData.data[id].qqNum,MyData.data[id].mima); 117 id++; 118 } 119 120 } 121 122 void show() 123 { 124 for (int i = 0; i < MyData.length; i++) 125 { 126 printf("qq号:%lld", MyData.data[i].qqNum); 127 printf(" 密码:%s", MyData.data[i].mima); 128 printf("\n"); 129 } 130 } 131 132 //比较函数 133 int cmp(const void *p1, const void *p2) 134 { 135 //类型转换,把void类型转化成(QQ *),这个类型和qsort传入的首地址类型有关 136 QQ *ptemp1 = (QQ *)p1; 137 QQ *ptemp2 = (QQ *)p2; 138 //大于返回1,等于返回0,小于返回-1 139 if (ptemp1->qqNum > ptemp2->qqNum) 140 { 141 return 1; 142 } 143 else if (ptemp1->qqNum < ptemp2->qqNum) 144 { 145 return -1; 146 } 147 else 148 { 149 return 0; 150 } 151 } 152 153 void main() 154 { 155 printf("%s\n\n", str); 156 157 //获取数据长度 158 MyData.length = getlength(str); 159 //获取有多少行数据 160 totalLength = strlen(str); 161 //数据清洗 162 wash(str); 163 //初始化 164 init(); 165 //调用快速排序 166 qsort(MyData.data, MyData.length, sizeof(MyData.data[0]), cmp); 167 show(); 168 system("pause"); 169 }