题解 | #简单错误记录#
简单错误记录
https://www.nowcoder.com/practice/2baa6aba39214d6ea91a2e03dff3fbeb
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { //定义储存结构体 char str[100]; int line; int num; } err; int main() { int k = 99; err stack[100]; char* tem = (char*)malloc(sizeof(char) * 100); //暂存每次scanf的全部输入字符串 int tem_line = 0; //暂存输入行数 int j = 0; while (~scanf("%s %d", tem, &tem_line)) { //当存在输入时 int i = 0; int n = strlen(tem); char* p = NULL; //创建指针寄存搜索位置 for (i = 0; i < n; i++) { //从输入字符串头部开始搜索找到最后一个\ if (tem[i] == '\\') { p = &tem[i]; //将地址存入p } } p += 1; //p的地址往前一位指向文件名 int n_t = strlen(p); //获取文件名长度 if (n_t > 16) { p = p + (n_t - 16); //当文件名大于16位时,截取后16位 } int flag = 0; //重复标志 for (i = k + 1; i <= 99; i++) { //判断与之前储存的文件名是否有重复 if (strcmp(p, stack[i].str) == 0 && tem_line == stack[i].line) { stack[i].num += 1; //如果重复,重复的文件名数量+1 flag = 1; //重复标志记为1 break; } } if (k >= 0) { //若没有超出数组索引 if (!flag) { //若没有重复,则将暂存文件名和行数存入结构体stack[k]中,初始化num为1 strcpy(stack[k].str, p); stack[k].line = tem_line; stack[k].num = 1; k--; //k往后移动 } } else if (k < 0) { //若超出数组索引(其实可以不用写这个...) if (!flag) { for (i = 99; i >= 1; i--) { stack[i] = stack[i - 1]; } strcpy(stack[0].str, p); stack[0].line = tem_line; stack[0].num = 1; k--; } } } if (k <= 91) { //如果输入数据大于8行 for (j = k + 8; j >= k + 1; j--) { printf("%s %d %d\n", stack[j].str, stack[j].line, stack[j].num); } } else if (k > 91) //小于8行 for (j = 99; j >= k + 1; j--) { printf("%s %d %d\n", stack[j].str, stack[j].line, stack[j].num); } }