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


相关文章
|
9月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
安全 程序员 编译器
【实战经验】17个C++编程常见错误及其解决方案
想必不少程序员都有类似的经历:辛苦敲完项目代码,内心满是对作品品质的自信,然而当静态扫描工具登场时,却揭示出诸多隐藏的警告问题。为了让自己的编程之路更加顺畅,也为了持续精进技艺,我想借此机会汇总分享那些常被我们无意间忽视却又导致警告的编程小细节,以此作为对未来的自我警示和提升。
1328 94
|
存储 C++ UED
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
1224 166
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
251 0
|
9月前
|
存储 机器学习/深度学习 编译器
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
【C++终极篇】C++11:编程新纪元的神秘力量揭秘
|
9月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。
|
9月前
|
存储 安全 算法
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
|
存储 搜索推荐 C++
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器
231 2
【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器2
|
消息中间件 存储 安全
|
存储 算法 C++
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用
文章详细探讨了C++中的泛型编程与STL技术,重点讲解了如何使用模板来创建通用的函数和类,以及模板在提高代码复用性和灵活性方面的作用。
196 2
C++提高篇:泛型编程和STL技术详解,探讨C++更深层的使用