题意:
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;
(循环记录是指如果没有满八条, 数据后插, 满八条就前插, 输出最靠近前面的八条(如果有八条的话))
(路径不一样而文件名一样的也要相加)
(因为要看全文件名是否一样, 所以查询的时候不能取后16字符, 必须全部比较完成后才能取最后16字符)
(净文件名就是全长文件名)
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
(注意是最后16个字符)
3、 输入的文件可能带路径,记录文件名称不能带路径。
因为要保证原来的输入顺序, 而map会自动按照key排序, 所以不能用map(map<string, int>),个人选择用vector+pair<>.
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
typedef pair<string, int> PAIR;
int main(){
string filename, line;
char temp[105];
vector<PAIR> st_vec;
while(cin >> temp >> line){
for(int i = 0;i < strlen(temp);++i){//去除路径
if(temp[i] != '\\'){
filename += temp[i];
}
else {
filename = "";
}
}
filename += " ";
filename += line;
bool isexit = false;//是否已经存在
int k;
for(k = 0;k < st_vec.size(); ++k){
if(st_vec[k].first == filename){
isexit = true;
break;
}
}
if(isexit == true){
st_vec[k].second ++;
}
else if(st_vec.size() >= 8)
st_vec.insert(st_vec.begin(), PAIR(filename, 1));
else
st_vec.push_back(PAIR(filename, 1));
}
string name;
int cnt;
cnt = st_vec.size() > 8 ? 8 : st_vec.size();
if(cnt >=8 ){逆序输出
for (int i = cnt-1;i >= 0 ; --i) {
int j;
name = st_vec[i].first;
for(j = 0;;++j){
if(name[j] == ' ') break;
}
if(j > 15)
name = st_vec[i].first.substr(j-16, st_vec[i].first.size() - (j-16));
cout << name << " " << st_vec[i].second << endl;
}
}
else{//顺序输出 写的太丑了
for (int i = 0;i <cnt ; ++i) {
int j;
name = st_vec[i].first;
for(j = 0;;++j){
if(name[j] == ' ') break;
}
if(j > 15)
name = st_vec[i].first.substr(j-16, st_vec[i].first.size() - (j-16));
cout << name << " " << st_vec[i].second << endl;
}
}
return 0;
最后输出的时候写的太繁杂, 就是为了处理有没有8组数据, 如果有人能帮我化简的话我会非常开心的。
给一组测试数据
测试用例:
C:\gtu\vcy\jk\zwthkipl 636 G:\rsle\lsax\yalcxu\vwhysms 637 F:\fzqz 640 E:\lswb\styce\thjnbxdvg 645 F:\up\qflvvayylipvj 635 C:\pivw\rkd 644 E:\tlkbjb\pcvnvm\qh\fzqz 633 E:\ezke\xvrdkuesnjerakzhs 641 E:\qflvvayylipvj 639 F:\ybpxk 644 G:\rfdr\faxpyhyznsssbo 630 E:\xktax\osekgaqy 646 C:\te 633 G:\albed\ffc\jclzfq\h 631 F:\zsshil\pkue\mazocurlwufmkkrw 635 E:\dmj\uefo\syabgm\qflvvayylipvj 643 F:\pgdiwvceluyzft 634 D:\xiqck\dta\lnh 639 E:\nu\nz\wwjpch\fzqz 650 E:\gfsahypjzwfglvou 644 G:\qh\thjnbxdvg 641 C:\cp\voause\mf\hebgpyzpyyybiywpv 632 E:\de\vet\vdooytekbghohqz 631 E:\cox\pvg\tlrlr 640 G:\hkc\fllkwmwlgiqahxbfs 638 E:\apjnogffvkwnv 637 E:\nldefh\ar\oqsb\uyobrilaabapini 630 F:\wgotle\ar\wgh\hebgpyzpyyybiywpv 639 G:\nrekjavm 634 C:\mvngfg\lfjnvz\xvrdkuesnjerakzhs 634 F:\exne\vh\kqh\fzqz 641 F:\lepvz 642 G:\qg\hcbh\uknyte\pgdiwvceluyzft 636 F:\ho\cn\uyobrilaabapini 637 E:\xbc\fzqz 642 G:\ju\nmdd\fzqz 643 G:\lzpmdx\rxp\ybpxk 629 D:\fc\lnh 629 D:\dsgvo\zwthkipl 631 G:\pujc\cgorfjzkqmnjathbiip 640 G:\vfhyp\cs\rrt 638 F:\oteh\ti\urajfw\tlrlr 636 C:\crdp\qwptjlorrmnv 642 D:\kcl\fqzs\zlm\pgdiwvceluyzft 640 G:\faxpyhyznsssbo 639 D:\swnhezhgdcwwbmkyqt 637 D:\azo\sry\faxpyhyznsssbo 633 C:\beqt\eh\dm\dlhehjccfdgrrzyj 642 F:\lepvz 635
对应输出应该为:
tlrlr 636 1 qwptjlorrmnv 642 1 pgdiwvceluyzft 640 1 faxpyhyznsssbo 639 1 nhezhgdcwwbmkyqt 637 1 faxpyhyznsssbo 633 1 dlhehjccfdgrrzyj 642 1 lepvz 635 1