题解 | #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
#include <stdio.h> #include<string.h> struct err { char arr[20]; int h; int count; }; int main() { //思路 //1.创建std存放文件名,行数,出现次数 结构体 struct err std1[101]; memset(std1, 0, sizeof(std1)); int i = 0; int j = 0; char std2[101] = { 0 }; int num2 = 0; int n = 0; while (scanf("%s %d", std2, &num2) != EOF) { int len = strlen(std2); for (j = 0; j < 16; j++) { //16个有效字符 if (std2[len - j - 1] == '\\') { //识别倒数第一个斜杠 break; } else { std1[i].arr[j] = std2[len - j - 1];//有效字符以逆序的形式存放在std1中 } } std1[i].h = num2;//存放行数 std1[i].count = 1;//存放出现次数 i++; n++;//共有几组数据 } int n2 = n; //2.操作std,对重复出现错误记录在第一次出现的位置++并且将当前位置置空; for (i = 0; i < n; i++) { if (std1[i].arr[0] == 0) continue; for (j = 1 + i; j < n; j++) { if (strcmp(std1[i].arr, std1[j].arr) == 0 && std1[i].h == std1[j].h) { memset(&std1[j], 0, sizeof(std1[j])); std1[i].count++; n2--; } } } //3.输出:循环队列实现输出; int front = 0; int rear = 0; struct err result[9]; memset(result, 0, sizeof(result)); i = 0; while (i < n) { if ((std1[i].count) != 0) { if ((rear + 1) % 9 != front) { memcpy(&result[rear], &std1[i], sizeof(std1[0])); rear=(rear+1)%9; } else { front = (front + 1) % 9; memcpy(&result[rear], &std1[i], sizeof(std1[0])); rear = (rear + 1) % 9; } } i++; } while (1) { if (front == rear) { break; } else { int len = strlen(result[front].arr); for (i = 0; i < len; i++) { printf("%c", result[front].arr[len - 1 - i]); } printf(" %d", result[front].h); printf(" %d\n", result[front].count); front = (front + 1) % 9; } } return 0; }