1. 程式人生 > >華為[程式設計題] 簡單錯誤記錄 (string的使用)

華為[程式設計題] 簡單錯誤記錄 (string的使用)

[程式設計題] 簡單錯誤記錄

時間限制:1秒

空間限制:65536K

開發一個簡單錯誤記錄功能小模組,能夠記錄出錯的程式碼所在的檔名稱和行號。 
處理:
1.記錄最多8條錯誤記錄,對相同的錯誤記錄(即檔名稱和行號完全匹配)只記錄一條,錯誤計數增加;(檔案所在的目錄不同,檔名和行號相同也要合併)
2.超過16個字元的檔名稱,只記錄檔案的最後有效16個字元;(如果檔名不同,而只是檔名的後16個字元和行號相同,也不要合併)
3.輸入的檔案可能帶路徑,記錄檔名稱不能帶路徑

輸入描述:

一行或多行字串。每行包括帶路徑檔名稱,行號,以空格隔開。

    檔案路徑為windows格式

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

輸出描述:

將所有的記錄統計並將結果輸出,格式:檔名程式碼行數數目,一個空格隔開,如: fpgadrive.c 1325 1 

    結果根據數目從多到少排序,數目相同的情況下,按照輸入第一次出現順序排序。

    如果超過8條記錄,則只輸出前8條記錄.

    如果檔名的長度超過16個字元,則只輸出後16個字元

輸入例子1:

E:\V1R2\product\fpgadrive.c 1325

輸出例子1:

fpgadrive.c 1325 1

注意: 要掌握string的 rfind()、substr()、erase()函式的使用方法

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

bool cmp(pair<string,int> a,pair<string,int> b){
	return a.second > b.second;
}

int main(){
	string add,line;
	vector<pair<string,int>> vec;
	int count = 0;
	while(getline(cin,add)){
		if(add.size() == 0)//當一行只輸入回車鍵時退出 
			break;
		int f = add.rfind('\\');//從右邊查詢 
		string str = add.substr(f+1);
		int flag = 0;
		for(int i=0;i<vec.size();i++)
		{
			if(vec[i].first == str){
				vec[i].second++;
				flag = 1;
				break;
			}		
		}
		if(flag == 0)
			vec.push_back(pair<string,int>{str,1});
	} 
	sort(vec.begin(),vec.end(),cmp);
	for(int i=0;i<vec.size() && i<8;i++){
		int pos = vec[i].first.find(' '); 
		if(pos > 16)
			vec[i].first.erase(0,pos-16);
		cout<<vec[i].first<<" "<<vec[i].second<<endl;
	}
		
	return 0;
}