在牛客上刷到简单错误记录题目,现在将通过的代码贴一下,供大家参考
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
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; }