题目描述
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、 记录最多8条错误记录,循环记录,对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。
输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
输出描述:
将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:
输入
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;
}
真坑,而且在测试用例里看不出有什么异常。
最后是,测试用例的输出格式,尽管在网页上看到的应该是用空格连接,但最后换行能正常通过。