描述: 

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

 

处理: 

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

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

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

 

知识点: 字符串 

题目来源: 内部整理 

练习阶段: 中级 

运行时间限制:无限制

内存限制:无限制


输入: 

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

 

如:E:\V1R2\product\fpgadrive.c   1325


 

输出: 

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

 fpgadrive.c 1325 1


样例输入:

E:\V1R2\product\fpgadrive.c   1325

          

样例输出:

fpgadrive.c 1325 1


解法如下,仅供参考:


#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <stdio.h>

using namespace std;

string getFileName(string filePath){
 // getFileName("E:\\V1R2\\product\\fpgadrive.c")
 // fpgadrive.c
 int len = filePath.length();
 int start = len-1;
 while(start>=0 && filePath[start]!='\\') start--;
 if(len-1-start>16)
  start = len-1-16;
 return filePath.substr(start+1);
}

int main(int argc, char const *argv[])
{
 char str[100];
 char lineNo[100];
 map<string, int> strMap;
 vector<string> vec(8,"");
 int index = 0;
 while(scanf("%s %s", str, lineNo) != EOF){
  // cout<<"test"<<"##"<<str<<"##"<<lineNo<<endl;
  string tmpStr = str;
  string tmpName = getFileName(tmpStr)+" "+lineNo;
  if(strMap.find(tmpName) != strMap.end()){
   strMap[tmpName]++;
  }else{
   if(index==8){
    index = 0;
    if(strMap.find(vec[index]) != strMap.end()){
     strMap.erase(strMap.find(vec[index]));
    }
    vec[index] = tmpName;
    strMap[tmpName]++;
    index++;
   }else{
    vec[index] = tmpName;
    strMap[tmpName]++;
    index++;
   }
  }
 }
 for(int i=0; i<strMap.size(); i++){
  string tmpName = vec[i];
  cout<<tmpName<<" "<<strMap[tmpName]<<endl;
 }
 return 0;
}