简单错误记录(C++)—— 一个坑

题目描述

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

处理:

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

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

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

输入描述:

 
 

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

输出描述:

 
 

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

示例1

输入

E:\V1R2\product\fpgadrive.c   1325

输出

fpgadrive.c 1325 1

运行的时候,出现了这样的情况:


即:

测试用例:

C:\gtu\vcy\jk\zwthkipl 636G:\rsle\lsax\yalcxu\vwhysms 637F:\fzqz 640E:\lswb\styce\thjnbxdvg 645F:\up\qflvvayylipvj 635C:\pivw\rkd 644E:\tlkbjb\pcvnvm\qh\fzqz 633E:\ezke\xvrdkuesnjerakzhs 641E:\qflvvayylipvj 639F:\ybpxk 644G:\rfdr\faxpyhyznsssbo 630E:\xktax\osekgaqy 646C:\te 633G:\albed\ffc\jclzfq\h 631F:\zsshil\pkue\mazocurlwufmkkrw 635E:\dmj\uefo\syabgm\qflvvayylipvj 643F:\pgdiwvceluyzft 634D:\xiqck\dta\lnh 639E:\nu\nz\wwjpch\fzqz 650E:\gfsahypjzwfglvou 644G:\qh\thjnbxdvg 641C:\cp\voause\mf\hebgpyzpyyybiywpv 632E:\de\vet\vdooytekbghohqz 631E:\cox\pvg\tlrlr 640G:\hkc\fllkwmwlgiqahxbfs 638E:\apjnogffvkwnv 637E:\nldefh\ar\oqsb\uyobrilaabapini 630F:\wgotle\ar\wgh\hebgpyzpyyybiywpv 639G:\nrekjavm 634C:\mvngfg\lfjnvz\xvrdkuesnjerakzhs 634F:\exne\vh\kqh\fzqz 641F:\lepvz 642G:\qg\hcbh\uknyte\pgdiwvceluyzft 636F:\ho\cn\uyobrilaabapini 637E:\xbc\fzqz 642G:\ju\nmdd\fzqz 643G:\lzpmdx\rxp\ybpxk 629D:\fc\lnh 629D:\dsgvo\zwthkipl 631G:\pujc\cgorfjzkqmnjathbiip 640G:\vfhyp\cs\rrt 638F:\oteh\ti\urajfw\tlrlr 636C:\crdp\qwptjlorrmnv 642D:\kcl\fqzs\zlm\pgdiwvceluyzft 640G:\faxpyhyznsssbo 639D:\swnhezhgdcwwbmkyqt 637D:\azo\sry\faxpyhyznsssbo 633C:\beqt\eh\dm\dlhehjccfdgrrzyj 642F:\lepvz 635

对应输出应该为:

tlrlr 636 1qwptjlorrmnv 642 1pgdiwvceluyzft 640 1faxpyhyznsssbo 639 1nhezhgdcwwbmkyqt 637 1faxpyhyznsssbo 633 1dlhehjccfdgrrzyj 642 1lepvz 635 1

你的输出为:

tlrlr 636 1 qwptjlorrmnv 642 1 pgdiwvceluyzft 640 1 faxpyhyznsssbo 639 1 nhezhgdcwwbmkyqt 637 1 faxpyhyznsssbo 633 1 dlhehjccfdgrrzyj 642 1 lepvz 635 1

命名与测试用例相同,为什么最后通过率是0%?

以下是我的错误代码:

#include<iostream>
#include <vector> 
#include<string>
#include<cstring>
using namespace std;
//分割字符串
vector<string> split(string str, string delim) {
	vector<string> res;
	if ("" == str) return res;
	//string类型转换为char*类型  
	char * strs = new char[str.length() + 1];
	strcpy(strs, str.c_str());

	char * d = new char[delim.length() + 1];
	strcpy(d, delim.c_str());

	char *p = strtok(strs, d);
	while (p != NULL) {
		string s = p; //分割得到的字符串转换为string类型  
		res.push_back(s); //存入结果数组  
		p = strtok(NULL, d);
	}

	return res;
}
int main() {
	vector<string> allname;
        vector<string> allhang;
	vector<string> filename;
	vector<int> filehang;
	vector<int> number;
        string a,b;
	while (cin>>a>>b) {
	allname.push_back(a);
        allhang.push_back(b);
	}
        //t用于保证只记录最后8条
        int t;
        if(allname.size()<=8){
        t=0;
        }
        else{
        t=allname.size()-8;
        } 
	for (; t < allname.size();t++) {
		string input=allname[t]+" "+allhang[t];
		string name;
		int hang;
		vector<string> a1 = split(input, " ");
		if (a1.size() == 2) {
			hang = atoi(a1[1].c_str());
			vector<string> a2 = split(a1[0], "\\");
			//保证最多16个文件名字符,并删除路径,保留文件名
			if (a2[a2.size() - 1].length() > 16) {
				name = a2[a2.size() - 1].substr(a2[a2.size() - 1].length() - 16, 16);
			}
			else {
				name = a2[a2.size() - 1];
			}
			//cout << "name:" << name << " hang:" << hang << endl;
			//循环记录,检验是否有重复
			if (filename.size() == 0) {
				filename.push_back(name);
				filehang.push_back(hang);
				number.push_back(1);
			}
			else {
				int tmp = 0;
				int i = 0;
				for (; i < filename.size(); i++) {
					if (filename[i].compare(name) == 0 && filehang[i] == hang) { tmp = 1; break; }
				}
				if (tmp == 1) {
					number[i]++;
				}
				else {
					filename.push_back(name);
					filehang.push_back(hang);
					number.push_back(1);
				}
			}
		}
	}
        for (int z = filename.size()-8; z < filename.size(); z++) {
         cout << filename[z] << " " << filehang[z] << " " << number[z] << endl;
	}  
        return 0;
}

我原理解是,只记录最后输入的8条数据,然后将统计结果进行输出

其实正确的应该是,将所有数据进行统计,将统计的最后8条进行输出

修改后代码如下,可通过100%测试用例

#include<string>
#include<cstring>
using namespace std;
//分割字符串
vector<string> split(string str, string delim) {
	vector<string> res;
	if ("" == str) return res;
	//string类型转换为char*类型  
	char * strs = new char[str.length() + 1];
	strcpy(strs, str.c_str());

	char * d = new char[delim.length() + 1];
	strcpy(d, delim.c_str());

	char *p = strtok(strs, d);
	while (p != NULL) {
		string s = p; //分割得到的字符串转换为string类型  
		res.push_back(s); //存入结果数组  
		p = strtok(NULL, d);
	}

	return res;
}
int main() {
	//char *a=new char[1000];
	vector<string> allname;
    vector<string> allhang;
	vector<string> filename;
	vector<int> filehang;
	vector<int> number;
    string a,b;
	while (cin>>a>>b) {
		allname.push_back(a);
        allhang.push_back(b);
	}
	int t=0;
	for (; t < allname.size();t++) {
		string input=allname[t]+" "+allhang[t];
		string name;
		int hang;
		vector<string> a1 = split(input, " ");
		if (a1.size() == 2) {
			hang = atoi(a1[1].c_str());
			vector<string> a2 = split(a1[0], "\\");
			//保证最多16个文件名字符,并删除路径,保留文件名
			if (a2[a2.size() - 1].length() > 16) {
				name = a2[a2.size() - 1].substr(a2[a2.size() - 1].length() - 16, 16);
			}
			else {
				name = a2[a2.size() - 1];
			}
			//cout << "name:" << name << " hang:" << hang << endl;
			//循环记录,检验是否有重复
			if (filename.size() == 0) {
				filename.push_back(name);
				filehang.push_back(hang);
				number.push_back(1);
			}
			else {
				int tmp = 0;
				int i = 0;
				for (; i < filename.size(); i++) {
					if (filename[i].compare(name) == 0 && filehang[i] == hang) { tmp = 1; break; }
				}
				if (tmp == 1) {
					number[i]++;
				}
				else {
					filename.push_back(name);
					filehang.push_back(hang);
					number.push_back(1);
				}
			}
		}
	
	}
    if(filename.size()<=8){
        for (int z = 0; z < filename.size(); z++) {
         cout << filename[z] << " " << filehang[z] << " " << number[z] << endl;
	}        
    }
    else{
       for (int z = filename.size()-8; z < filename.size(); z++) {
         cout << filename[z] << " " << filehang[z] << " " << number[z] << endl;
	}  
    }
	return 0;
}

真坑,而且在测试用例里看不出有什么异常。

最后是,测试用例的输出格式,尽管在网页上看到的应该是用空格连接,但最后换行能正常通过。








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值