问题概要
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
对应牛客网题目HJ19 简单错误记录
思路分析
其实这个题目并没有用到特别复杂的技巧,重点是对字符串的处理,以及模拟整个记录的过程。
代码实现
#include <stdio.h>
#include <string.h>#define MAX_ERROR_RECORDS 100
#define MAX_FILENAME_LENGTH 17// 定义错误记录结构体
typedef struct {char filename[MAX_FILENAME_LENGTH]; // 存储文件名的后16个字符int line_number; // 存储行号int cnt; // 存储错误次数
} ErrorRecord;int main() {char in_str[200];int num;int head = 0;ErrorRecord list[MAX_ERROR_RECORDS];memset(list, 0, sizeof(list));while (scanf("%s %d", in_str, &num) != EOF) {char* p = strrchr(in_str, '\\'); // 找到最后一个斜杠if (p == NULL) {p = in_str; // 如果没有斜杠,即文件名即为整个输入字符串} else {++p; // 移动指针,跳过斜杠// 如果存在盘符,则跳过盘符和冒号if (p[1] == ':') {p += 2;}}int len = strlen(p);strncpy(list[head].filename,len > 16 ? p + len - 16 : p,MAX_FILENAME_LENGTH - 1);list[head].filename[MAX_FILENAME_LENGTH - 1] ='\0'; //确保文件名称字符串的结束符list[head].line_number = num;int found = 0;for (int i = 0; i < head; ++i) {if (strcmp(list[i].filename, list[head].filename) == 0 &&list[i].line_number == list[head].line_number) {++list[i].cnt;found = 1;break;}}if (!found) {++list[head].cnt;++head;if (head == MAX_ERROR_RECORDS) {head = 0; // 循环记录}}}// 输出最后的错误记录int start = head >= 8 ? head - 8 : 0;for (int i = start; i < head; i++) {printf("%s %d %d\n", list[i].filename, list[i].line_number, list[i].cnt);}return 0;
}
注
这个代码虽然不复杂,但想要理解,还是需要好好的从头看一遍的。
希望本篇文章能对您有所帮助。
感谢阅读w