开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)
3.输入的文件可能带路径,记录文件名称不能带路径
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct Record {//这里声明了一个记录的结构体,其中有三项 文件名,错误行号及错误数目
string filename;
int column;
int count;
};
Record rec[10];//这个结构体数组大小为10
string getFileName(string str){
int pos = str.rfind('\\');//找到‘\’位置,rfind反向查找,有篇博文专门说明了find的使用方法可以查一下
return str.substr(pos + 1);
}
bool cmp(Record r1, Record r2){//降序排列
return r1.count > r2.count;
}
int main(){
string inStr;
int col;
char tmp[100];
int sum = 0;
while((scanf("%s%d", tmp, &col)) != EOF){ //读取str到char数组和int对象中
// cout << endl << tmp << endl << col << endl; //输出原始数据
bool flag = false; // 这里是**标志位
inStr = tmp;
inStr = getFileName(inStr);//获取文件名,此处的文件名为‘\’之后所有的文件名,并未删减超过16位的,返回值是string格式
for(int i = 0; i < sum; i++){
if(rec[i].filename == inStr && rec[i].column == col){//文件名相同且行号相同,计数+1
rec[i].count++;
flag = true;//有相同的
}
}
if(!flag && sum<9){//如果没有相同的存储数据
rec[sum].filename = inStr;
rec[sum].column = col;
rec[sum].count = 1;
sum++;
}
}
sort(rec, rec + sum, cmp);//0-sum排序
for(int i = 0; i < min(8, sum); i++){//判断存储数目小于8
if(rec[i].filename.length() <= 16){//判断文件名是否大于16个字符,小于直接输出
cout << rec[i].filename;
}
else{
cout << rec[i].filename.substr(rec[i].filename.length() - 16);//else输出后16位
}
cout << " " << rec[i].column << " " << rec[i].count << endl;
}
return 0;
}
这道题先建立一个struct之后用来存储所需要的文件名,行号及出现次数,大小为10
在main函数前声明并且规定大小就已经为该struct开辟存储空间,之后可以直接使用
rec[i].filename.length() 返回结构体中string的长度
sort(rec, rec + sum, cmp) 可以对结构体排序
substr (字符串,截取开始位置,截取长度) //返回截取的字
substr('Hello World',0,1) //返回结果为 'H' *从字符串第一个字符开始截取长度为1的字符串
substr('Hello World',1,1) //返回结果为 'H' *0和1都是表示截取的开始位置为第一个字符
substr('Hello World',2,4) //返回结果为 'ello'
substr('Hello World',-3,3)//返回结果为 'rld' *负数(-i)表示截取的开始位置为字符串右端向左数第i个字符