#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct _log{ char name[50]; //文件名 int line; //行数 int count; //出现次数 int namelength; //名字长度 int appear; //出现位置 } mylog, *plog; //日志参数结构体 int main() { plog addr[1000]; //指针数组 int curaddr = 0; char str[50]; int line; int i, j; int n = 0; int dash = 0; int flag = 0; int namelength; memset(str, 0, sizeof(str)); while(scanf("%s", str) != EOF){ scanf("%d", &line); for(j = 0; j < 50; j++){ //解析文件名和文件名长度 if(str[j] == '\0'){ namelength = j - dash - 1; break; } if(str[j] == '\\'){ dash = j; } } for(i = 0; i < curaddr; i++){ //检测文件名是否出现过 if((!memcmp(&str[dash+1], addr[i]->name, namelength)) && (line == addr[i]->line)) { addr[i]->count++; flag = 1; break; } } if(flag == 0){ //新建日志 addr[curaddr] = malloc(sizeof(mylog)); addr[curaddr]->line = line; addr[curaddr]->count = 1; addr[curaddr]->namelength = namelength; memcpy(addr[curaddr]->name, &str[dash + 1], addr[curaddr]->namelength); addr[curaddr]->appear = n; n++; curaddr++; } flag = 0; memset(str, 0, sizeof(str)); } for(i = 0; i < curaddr - 1; i++){ //排序 for (j = curaddr - 1; j > i; j--){ if((addr[j]->count > addr[j - 1]-> count) || ((addr[j]->count == addr[j - 1]-> count) && (addr[j]->appear < addr[j - 1]-> appear))) { plog temp = addr[j]; addr[j] = addr[j - 1]; addr[j - 1] = temp; } } } int begin = 0; if(curaddr > 8) curaddr = 8; for(i = 0; i < curaddr; i++){ //输出 if(addr[i]->namelength < 16) begin = 0; else begin = addr[i]->namelength - 16; printf("%s %d %d\n", &(addr[i]->name[begin]), addr[i]->line, addr[i]->count); } }