《华为机试在线训练》之简单错误记录

题目描述

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

 

处理: 

 

1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;

 

2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;

 

3、 输入的文件可能带路径,记录文件名称不能带路径。


输入描述:

一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。

输出描述:

将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:

示例1

输入

E:\V1R2\product\fpgadrive.c   1325

输出

          看题目中的处理要求和测试用例可以发现,输出结果一定要除掉路径,就是要将“\”之前的字符全都去掉,不打印输出,同时注意到题目要求只能记录文件的最后16个有效字符,意思就是说如果文件名称大于16个字符的话,只截取后面16个字符作为文件名称输出,最后看要求1,记录最多8条错误记录,循环记录,对相同的记录只记录一条,错误计数增加,这就要做错误相同性判断,根据这些要求可以将该题目细分为三个部分:

一,去路径处理

    

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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值