简单错误记录

简单错误记录

题目

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

处理:

  1. 记录最多8条错误记录,循环记录(或者说最后只输出最后出现的八条错误记录),对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;
  2. 超过16个字符的文件名称,只记录文件的最后有效16个字符
  3. 输入的文件可能带路径,记录文件名称不能带路径。题目出处

思路

根据条件详细判断。

重复时不记录数据,使原结构数组里的次数值+1;

只记录后八条。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#pragma warning(disable : 4996)
typedef struct sp {
char bit[100];
int hang;
int time;
}NODE;
int main(void)
{
char bit[1000];
char number[10];
char name[17];
NODE club[200];
NODE* p;
int i, j = 0, k, l = 0, end1, end2, end3, end4, end5, namber2;
in:while (gets(bit) != NULL)
{
for (i = 0, end1 = 0, end2 = 0; i < strlen(bit); i++)
{
if (bit[i] == '\\')
end1 = i + 1; //end1为地址开始位置
if (isspace(bit[i]))
{
end2 = i; //end2位地址结束位置
break;
}
}
if ((end2 - end1) <= 16) //是否在16位里
i = end1;
else i = end2 - 16;
for (k = 0; i < end2; i++)
name[k++] = bit[i]; //存储名字
name[k] = '\0';
for (i = end2, l = 0, end4 = 0; i < strlen(bit); i++)
if (isdigit(bit[i]))
{
end4 = i; //end4行数结束位置
l++;
}
end3 = end4 - l; //end3行数开始位置
for (i = end3, k = 0; i < end4 + 1; i++)
number[k++] = bit[i];
number[k] = '\0'; //记录行数
namber2 = atoi(number);
for (i = 0; i < j; i++)
if (strcmp(name, club[i].bit)==0 && namber2 == club[i].hang)
{

(club[i].time)++; //重复使已记录值加1 不记录这次的数据
goto in;
}
p = (NODE*)malloc(sizeof(NODE)); //不重复则记录数据,记得用free释放内存

strcpy((*p).bit, name);
p->hang = namber2;
p->time = 1;
club[j] = *p;
j++;
}

if (j > 8)
end5 = j - 8; //只记录后五条
else end5 = 0;
for (i = end5; i < j; i++)
printf("%s %d %d\n", club[i].bit, club[i].hang, club[i].time);
return 0;
}

反思

通过存入另一数组的情况下去重,牢记malloc和free搭配,房子内存泄漏。

打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020 lsengard
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信