在牛客上刷到简单错误记录题目,现在将通过的代码贴一下,供大家参考
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是”相同“的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct s_errlog
{
char filename[50];
int errline;
int errcount;
} errlog;
typedef struct s_errnode
{
errlog * log;
struct s_errnode * next;
struct s_errnode * prev;
}errnode;
void dealerrlog(errnode * errlist,errnode * tail, char *filename,int errline)
{
errnode * ptempnode = errlist->next;
//printf("3\n");
while(ptempnode)
{
//printf("4\n");
errlog * ptemplog = ptempnode->log;
if(ptemplog!=NULL)
{
//printf("5 %s\n",ptemplog->filename);
if((strcmp(ptemplog->filename,filename)==0) && ptemplog->errline==errline)
{
ptemplog->errcount++;
return ;
}
}
ptempnode=ptempnode->next;
}
//printf("6\n");
int count = 0;
if(ptempnode==NULL)
{
ptempnode = errlist;
errnode * head = errlist->next;
while(ptempnode->next!=NULL)
{
ptempnode=ptempnode->next;
count++;
}
errnode * newnode = (errnode *)malloc(sizeof(errnode));
errlog * newlog = (errlog *)malloc(sizeof(errlog));
strcpy(newlog->filename,filename);
newlog->errline = errline;
newlog->errcount = 1;
newnode->log = newlog;
newnode->next = NULL;
ptempnode->next = newnode;
newnode->prev = ptempnode;
tail = newnode;
//printf("7 %s\n",filename);
//if(count>=8)
//{
// errnode * pdelnode = head->next;
// errlist->next = head->next;
// free(head->log);
// free(head);
// head=NULL;
//}
//printf("4 %s\n",filename);
return;
}
};
int main()
{
char inputfile[100]={0};
int inputline;
errnode * errlist= (errnode *)malloc(sizeof(errnode));
errlist->next = NULL;
errlist->log = NULL;
errlist->prev = NULL;
errnode * ptail = errlist;
while(scanf("%s %d",inputfile,&inputline)!=EOF)
{
//printf("inputfile = %s\n",inputfile);
char * p = strrchr(inputfile,'\\');
p++;
if(strlen(p)>16)
p += strlen(p)-16;
//printf("1-%s\n",p);
char filename[50]={0};
strcpy(filename,p);
//printf("1-%s dd",filename);
dealerrlog(errlist,ptail,filename,inputline);
}
errnode * pnexterrnode = errlist->next;
//errnode * ppreverrnode = ptail;
int count = 0;
while(pnexterrnode!=NULL)
{
//printf("aaa");
errlog * ptemplog = pnexterrnode->log;
if(ptemplog!=NULL)
{
// printf("%s %d %d\n",ptemplog->filename,ptemplog->errline,ptemplog->errcount);
count ++;
}
pnexterrnode = pnexterrnode->next;
}
if(count > 0)
{
errlog clog[count];
int i = 0;
pnexterrnode = errlist->next;
while(pnexterrnode!=NULL)
{
errlog * ptemplog = pnexterrnode->log;
if(ptemplog!=NULL)
{
//memset(clog[i].filename,0,50);
strcpy(clog[i].filename,ptemplog->filename);
//printf("%s \n",clog[i].filename,ptemplog->filename);
clog[i].errline = ptemplog->errline;
clog[i].errcount = ptemplog->errcount;
i++;
}
pnexterrnode = pnexterrnode->next;
}
int j = 0;
if(count>8)
j = count - 8;
for(;j<count;j++)
{
printf("%s %d %d\n",clog[j].filename,clog[j].errline,clog[j].errcount);
}
}
return 0;
}