如何仅用指针运算求取Packet结构体数组中出现频率最高的sourceIP
实现思路
- 采用双层指针遍历的暴力统计方案,不需要额外哈希表,适合小规模数据集,全程仅使用指针运算,不出现任何方括号
- 外层指针遍历每一个Packet元素,取其sourceIP作为待统计目标
- 内层指针遍历全量Packet元素,匹配与待统计IP一致的元素并计数
- 每次完成单个IP的计数后,和当前记录的最高出现次数对比,若更高则更新最高次数和对应的高频IP
完整可运行代码
#include <stdio.h> #include <string.h> #include <stdlib.h> // 复用你提供的结构体定义 typedef enum { IN_IN, IN_OUT, OUT_IN} Direction; typedef enum { IGMP, TCP, UDP} Protocol; typedef unsigned int Count; #define NUM 6 typedef struct { long long timestamp; Direction direction; char sourceIP[16]; char destIP[16]; Protocol protocol; unsigned int port; Count bytes; }Packet; char* getMostFrequentSourceIP(Packet *packets, int N) { // 申请内存存储最高频IP和当前遍历IP,避免用方括号定义数组 char *mostFreqIP = (char*)malloc(16 * sizeof(char)); char *currentIP = (char*)malloc(16 * sizeof(char)); int maxCount = 0; Packet *outerPtr = packets; for (int i = 0; i < N; i++) { int currentCount = 0; strcpy(currentIP, outerPtr->sourceIP); Packet *innerPtr = packets; // 内层遍历统计当前IP出现次数 for (int j = 0; j < N; j++) { if (strcmp(currentIP, innerPtr->sourceIP) == 0) { currentCount++; } innerPtr++; } // 更新最高频记录 if (currentCount > maxCount) { maxCount = currentCount; strcpy(mostFreqIP, currentIP); } outerPtr++; } free(currentIP); return mostFreqIP; } // 测试入口 int main() { Packet packetsarray[NUM] = { {42069, IN_OUT, "192.100.200.2", "192.10.0.6", TCP, 30, 256 }, {666, OUT_IN, "148.201.196.208", "148.201.196.1", UDP, 80,666}, {1002, IN_IN, "192.100.200.2", "10.10.0.6", IGMP, 30, 256 }, {1002, IN_OUT, "192.100.200.2", "10.10.0.6", IGMP, 30, 256 }, {1002, OUT_IN, "192.100.200.2", "10.10.0.6", IGMP, 30, 256 }, {1002, IN_OUT, "192.100.200.2", "10.10.0.6", IGMP, 30, 256 } }; char *res = getMostFrequentSourceIP(packetsarray, NUM); printf("出现频率最高的源IP是: %s\n", res); free(res); return 0; }
代码说明
- 核心逻辑全程没有使用任何方括号,所有结构体数组的访问都通过指针偏移实现:outerPtr和innerPtr每次自增1,就会自动偏移一个Packet结构体的大小,指向下一个元素
- 字符串的复制和比较直接调用标准库的
strcpy和strcmp即可,不需要手动遍历字符数组 - 后续要扩展统计目标IP的功能,只需要把代码中所有的
sourceIP替换为destIP即可,逻辑完全一致 - 如果不允许使用malloc,可以直接把返回值设计为void,由调用方传入一个16字节的字符指针存储结果,同样不需要用到方括号
内容的提问来源于stack exchange,提问作者Humberto Longoria
相关产品推荐
相关产品推荐

