赞
踩
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:
一,去路径处理
- string getfilename(string &path)
- {
- int pos;
- string result;
- pos=path.rfind('\\'); //寻找“\”的位置,标记为pos
- result=path.substr(pos+1,path.size()-pos); //将从pos之后的数值存放在result中,这样就可以去掉路径
- if(result.length()>16) //判断result中的字符串长度是否大于16,如果大于16则要截取后面16个字符
- {
- result=result.substr(result.length()-16,16); //截取后16个字符
- }
- return result;
- }
该函数中使用到了字符串的两个处理函数,rfind()和substr()函数,具体的操作在注释中可以清晰地看到,为什么要这样做,每一步的进行都是为了符合题目中处理的要求。以该子函数中的使用为例,简单介绍一下这两个函数。
1,rfind()函数
string中的find函数与rfind函数定义如下:
int find(char c,int pos=0) const; //从pos开始查找字符c在当前串中的位置
int find(const char *s,int pos=0) const; //从pos开始查找字符串s在当前串中的位置
int find(const char *s,int pos,int n) const; //从pos开始查找字符串s中前n个字符在当前串中的位置
int find(const string &s,int pos=0) const; //从pos开始查找字符串s在当前串中的位置
//查找成功时返回所在的位置,失败了则返回string::npos的值
int find(char c,int pos=0) const; //从pos开始由后向前地查找字符c在当前串中的位置
int find(const char *s,int pos=0) const; //从pos开始由后向前地查找字符串s在当前串中的位置
int find(const char *s,int pos,int n) const; //从pos开始由后向前地查找字符串s中前n个字符在当前串中的位置
int find(const string &s,int pos=0) const; //从pos开始由后向前地查找字符串s在当前串中的位置
2,substr()函数
substr函数的功能是从给定的字符表达式或者备注字段中返回一个子字符串。主要功能是复制字符串,要求从指定位置开始,并具有指定的长度。具体用法如下所示:
string str;
str.substr(pos,length);
pos为指定的位置,length为从pos位置开始复制长度为length的字符串出来,可以称为字符截取函数。
二,结构体定义以及重复性函数
- struct error_codes{
- string filename;
- int codeline;
- int counter=1;
- bool operator==(const error_codes &a)
- {
- if(a.filename==filename&&a.codeline==codeline)
- return true;
- else
- return false;
- }
- };
定义一个结构体来存放错误文件名称、错误行、错误数量,其中定义一个布尔函数,判断是否有重复的错误,即文件名称与错误行数都相等。
三,输入和重复性查找
- while(cin>>path>>codeline)
- {
- error_codes temp;
- temp.filename=getfilename(path);
- temp.codeline=codeline;
- vector<error_codes>::iterator res;
- res=find(arr.begin(),arr.end(),temp); //在arr中查找temp值,
- if(res==arr.end())
- {
- arr.push_back(temp);
- }
- else
- {
- res->counter++;
- }
-
-
-
-
- }
因为有多组用例输入,所以要用while循环,之前有同学遇到过在自己的电脑上运行程序可以输出结果,但是在牛客网上提交代码的时候没有结果输出,这就是没有进行while循环输入的原因,因为测试用例为多组,所以要进行循环输入。在这里,在输入之后查找输入在之前的输入之中有没有重复一致的错误,如果有就错误计数加1。
四,完整程序代码如下:
- #include <iostream>
- #include <string>
- #include <vector>
- #include <algorithm>
- using namespace std;
-
- struct error_codes{
- string filename;
- int codeline;
- int counter=1;
- bool operator==(const error_codes &a)
- {
- if(a.filename==filename&&a.codeline==codeline)
- return true;
- else
- return false;
- }
- };
-
- string getfilename(string &path);
- int main()
- {
- vector<error_codes> arr;
- string path;
- int codeline;
-
- //int error_line;
- while(cin>>path>>codeline)
- {
- error_codes temp;
- temp.filename=getfilename(path);
- temp.codeline=codeline;
- vector<error_codes>::iterator res;
- res=find(arr.begin(),arr.end(),temp); //在arr中查找temp值,
- if(res==arr.end())
- {
- arr.push_back(temp);
- }
- else
- {
- res->counter++;
- }
-
-
-
-
- }
- int j=0;
- if(arr.size()>8)
- {
- j=arr.size()-8;
- }
- for(;j<arr.size();j++)
- {
- cout<<arr[j].filename<<" "<<arr[j].codeline<<" "<<arr[j].counter<<endl;
- }
-
- return 0;
- }
-
- string getfilename(string &path)
- {
- int pos;
- string result;
- pos=path.rfind('\\'); //寻找“\”的位置,标记为pos
- result=path.substr(pos+1,path.size()-pos); //将从pos之后的数值存放在result中,这样就可以去掉路径
- if(result.length()>16) //判断result中的字符串长度是否大于16,如果大于16则要截取后面16个字符
- {
- result=result.substr(result.length()-16,16); //截取后16个字符
- }
- return result;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。