C/C++编程题之简单错误记录

在牛客上刷到简单错误记录题目,现在将通过的代码贴一下,供大家参考

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

处理:

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;
}

猜你喜欢

转载自blog.csdn.net/lzyzuixin/article/details/111387185
今日推荐