开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
思路
①首先字符串处理,有一个转义符误区,得到文件名和行数。然后定义一个map就行相同文件名和行数进行统计,map插入会改变输入顺序,这是第二个误区,需要一个辅助记录输入顺序。最后map转化结构题数组,进行结构体排序。
②结构体排序可以用sort和qsort,但是在本案例中qsort不能通过,我也不知什么个情况,注意cmp函数的返回会值(二者不同),已及决定升降序排序(刚好相反)。
作者:IIYMGF
来源:CSDN
原文:https://blog.csdn.net/hqh131360239/article/details/80968945
版权声明:本文为博主原创文章,转载请附上博文链接!
#include<iostream>
#include<string>
#include<stdlib.h>
#include<string.h>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
using namespace std;
map<string,int> flag;//记录每个输入的顺序
int counts=0;
struct node{
string x;
int y;
};
int cmp(const node &a,const node &b)
{
if(a.y==b.y)
return flag[a.x]<flag[b.x]?1:0;
return a.y>b.y?1:0;
}
int main()
{
char a[1000];
char b[100];
set<string> s;//输入的集合
map<string,int> ans;//存放结果
while(cin>>a>>b)
{
int len=strlen(a);
int i=len-1;
for(;i>=0;i--)
{
if(a[i]=='\\')//转义字符
break;
}
string fn;
for(i++;i<len;i++)
{
fn+=a[i];
}
fn+=" ";
fn+=b;//fn此时是记录的一个例子
if(s.find(fn)!=s.end())//set中存在相同记录
{
ans[fn]=ans[fn]+1;//记录值个数加1
}
else{
counts++;//输入顺序数
flag[fn]=counts;
s.insert(fn);//加入set
ans[fn]=1;
}
}
node* p=(node*)malloc(counts*sizeof(node));
int j=0;
for(map<string,int>::iterator it=ans.begin();it!=ans.end();it++)
{
p[j].x=it->first;
p[j].y=it->second;
j++;
}
sort(p,p+counts,cmp);
int num=0;
for(int i=0;i<counts;i++)
{
int len=(p[i].x).length();
int l;
for(l=len-1;l>=0;l--)
{
if((p[i].x)[l]==' ')
break;
}
if(l<=16)
{
cout<<p[i].x;
}
else{
string q;
for(int left=l-16;left<len;left++)
{
q+=(p[i].x)[left];
}
cout<<q;
}
cout<<" "<<p[i].y<<endl;
num++;
if(num==8)
break;
}
return 0;
}