问题概要
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
对应牛客网题目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