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

简介: 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是”相同“的错误记录。

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


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



处理:



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


相关文章
|
3天前
|
算法 编译器 C语言
探索C++编程的奥秘与魅力
探索C++编程的奥秘与魅力
|
3天前
|
安全 算法 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits处理弱枚举和强枚举
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits处理弱枚举和强枚举
54 3
|
3天前
|
算法 编译器 C++
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
【C/C++ 泛型编程 应用篇】C++ 如何通过Type traits 判断 Lambda表达式类型?
47 4
|
3天前
|
编译器 C语言 C++
C语言,C++编程软件比较(推荐的编程软件)
C语言,C++编程软件比较(推荐的编程软件)
|
3天前
|
安全 前端开发 程序员
|
3天前
|
算法 安全 编译器
【C++】从零开始认识泛型编程 — 模版
泛型编程是C++中十分关键的一环,泛型编程是C++编程中的一项强大功能,它通过模板提供了类型无关的代码,使得C++程序可以更加灵活和高效,极大的简便了我们编写代码的工作量。
15 3
|
3天前
|
并行计算 调度 C++
|
3天前
|
安全 程序员 编译器
【C/C++ 泛型编程 进阶篇 Type traits 】C++类型特征探究:编译时类型判断的艺术
【C/C++ 泛型编程 进阶篇 Type traits 】C++类型特征探究:编译时类型判断的艺术
185 1
|
3天前
|
算法 程序员 C++
【C/C++ 泛型编程 应用篇】C++ 对多参数的参数包的 参数类型提取 应用
【C/C++ 泛型编程 应用篇】C++ 对多参数的参数包的 参数类型提取 应用
49 5
|
3天前
|
Java Linux 调度