首先,我发现我过程中要比较文件名和行号的组合,不仅如此,还要记录这个组合出现的次数。所以果断采用结构体:
struct Error{
string filename;
string line;
int count;
};
剩下的不难,就是要求多,细节多。
首先读入一个case:while(cin >> name >> num)
去掉name里的路径,只留下完整的文件名,用到了函数name.find_last_of("\\");注意两点,一个是这个函数的使用,另一个是注意转义字符\
得到完整的文件名filename之后遍历结果集,判断是否出现过filename和num的组合,出现的话,该结构体的count加1.否则加入结果集,count为1
然后按照要求准备输出,输出之前要排序。这里用到结构体的自定义的比较函数,从大到小排序:
bool comp(const Error &a, const Error &b)
{
return a.count > b.count;
}
排序后不要忘记两个输出细节:最多输出8条记录,文件名超过16的,只输出后16个字符。
#include <iostream>
#include <string>
#include <vector>
#include<algorithm>
using namespace std;
struct Error{
string filename;
string num;
int count;
};
vector<Error> v;
bool comp(const Error &a, const Error &b){
return a.count > b.count;
}
void createError(string name, string num){
int p = name.find_last_of("\\");
string filename = name.substr(p+1);
int i = 0, size = v.size();
for(i = 0; i < size; ++i){
if(v[i].filename == filename && v[i].num == num){
v[i].count++;
break;
}
}
if(i == size){
Error e;
e.filename = filename;
e.num = num;
e.count = 1;
v.push_back(e);
}
}
int main()
{
string name, num;
while(cin >> name >> num){
createError(name, num);
}
sort(v.begin(), v.end(), comp);
int size = min((int)v.size(), 8);
for(int i = 0; i < size; ++i){
string nameres;
if(v[i].filename.size() > 16){
nameres = v[i].filename.substr(v[i].filename.size()-16);
}else{
nameres = v[i].filename;
}
cout << nameres << " " << v[i].num << " " << v[i].count << endl;
}
return 0;
}