首先看一下题
描述
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是“相同”的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准
数据范围:错误记录数量满足 1≤n≤100 ,每条记录长度满足 1≤len≤100
输入描述:
每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
输出描述:
将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开,如:
示例1
输入:
D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645 E:\je\rzuwnjvnuz 633 C:\km\tgjwpb\gy\atl 637 F:\weioj\hadd\connsh\rwyfvzsopsuiqjnr 647 E:\ns\mfwj\wqkoki\eez 648 D:\cfmwafhhgeyawnool 649 E:\czt\opwip\osnll\c 637 G:\nt\f 633 F:\fop\ywzqaop 631 F:\yay\jc\ywzqaop 631 D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645输出:
rzuwnjvnuz 633 1 atl 637 1 rwyfvzsopsuiqjnr 647 1 eez 648 1 fmwafhhgeyawnool 649 1 c 637 1 f 633 1 ywzqaop 631 2复制说明:
由于D:\cfmwafhhgeyawnool 649的文件名长度超过了16个字符,达到了17,所以第一个字符'c'应该被忽略。 记录F:\fop\ywzqaop 631和F:\yay\jc\ywzqaop 631由于文件名和行号相同,因此被视为同一个错误记录,哪怕它们的路径是不同的。 由于循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准,所以D:\zwtymj\xccb\ljj\cqzlyaszjvlsjmkwoqijggmybr 645不会被记录。
一、问题分析
首先读题,题目要求:
1.开发一个简单的错误记录功能小模块
2.能够记录出错的代码所在的文件名和行号
3.记录最多8条错误记录
4.循环记录
5.只输出最后出现的八条错误记录
6.相同的错误只需要记录一条,但是错误计数累加
7.最后的一个斜杠后面的带后缀名的部分(保留16位)和行号这两个都完全匹配的才是“相同”的错误
8.超过16个字符的文件名,只记录文件的最后有效16个字符
9.输入的文件可能带路径,但是记录的文件名称不带路径,哪怕文件路径不同,只要名字的最后16个字符相同,也被视为相同的错误记录
这里我有点疑问,是不是最后十六位和行号都需要相同才算是相同的错误记录?
10.循环记录时,只以第一次出现的顺序为准,后面重复的不会更新他的出现时间,仍以第一次为准
这句话我认为意思是说我们虽然只需要输出8条记录但是我们要记录全部的错误记录,这样才能记住之前出现的时间,才能保证后面重复的出现不会更新他的出现时间
11.错误记录数量n在[1,100]的范围
12.每条记录的长度len在[1,100]的范围
13.输入描述:每组只包含一个测试用例.一个测试用例包含一行或多行字符串.每行包括带路径文件名称,行号,以空格隔开.
14.输出描述:将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开
二、解题思路
1.首先我们需要定义一个字符串record[101]一个整数line用来读取错误记录
2.然后我们思考一下用什么储存我们的错误记录
首先我们需要储存的数据有文件名、代码行数、错误次数这三种数据
我们可以定义一个字符串数组recordname[错误记录数量][17]用来存储我们错误的记录的名字
其中错误记录数量是我们给他分配的空间,在读取的过程中我们使用到的空间时候可能会小于这个数字,使用的时候我们将错误记录的序号记录在上面
然后我们定义一个数组recordinfo[错误记录数量][2]用来记录我们错误记录的代码行数、错误次数这两个数据分别对应recordinfo[错误记录数量][0]和recordinfo[错误记录数量][1]
3.我们还需要一个整数int count = 0;用来计算我们的出现的错误记录数量
4.然后我们就可以开始逐行读取数据了
5.我们先把数据存储到record和line中
6.我们将record中最后的/之后的部分储存到一个新的char filename[100]中
7.我们使用strlen测量一下filename的长度并且将长度储存到len中
8.对于长度大于16的情况,我们只保留最后16个字符,也就是说我们
定义一个char newfilename[17];
比如filename的长度是20,
我们截取第3-19个位置的字符到我们的newfilename的第0-16个位置中.然后我们第17位设为'\0'字符串结束符
处理完名字之后我们开始在现有的记录中查找是否有相同的记录,如果有(名字相同且行数相同)那么我们错误次数加一
如果没有相同的记录那么我们count加一,并且将recordname[count] = newfilename;
recordinfo[count][0] = line;
recordinfo[count][1] = 1;
9.循环结束后我们做一个判断,
如果count >= 8
比如有九条记录,那么我们输出第2-9条记录
也就是count-8到count
如果count < 8,那么我们输出从0到count的记录
三、具体步骤
使用的语言是C
#include <stdio.h>
#include <string.h>char* getFilename(const char *path) {int len = strlen(path);for(int i = len; i > 0; i--) {if(path[i] == '\\') {return (char*)(path + i + 1);break;}}return (char*)path;
}
int main() {char record[101];int linenumber;char recordname[100][17];int recordinfo[100][2];int count = 0;while (scanf("%s %d", record, &linenumber) != EOF) { char *filename = getFilename(record);//printf("filename is %s\n", filename);int len = strlen(filename);char newfilename[17];if (len > 16) {strncpy(newfilename, filename + len - 16, 16);newfilename[16] = '\0';} else {strcpy(newfilename, filename);}int findsame = 0;for(int i = 0; i < count; i++){if((strcmp(recordname[i], newfilename) == 0) && (recordinfo[i][0] == linenumber)){recordinfo[i][1]++;// printf("when file name is %s, the i is %d\n", recordname[i], i);// printf("the new filename is %s", newfilename);// printf("find same error.\n");findsame = 1;break;}}if(findsame == 0){strcpy(recordname[count], newfilename);recordinfo[count][0] = linenumber;recordinfo[count++][1] = 1;}}if(count > 8) {for(int i = count - 8; i < count; i++){printf("%s %d %d\n", recordname[i], recordinfo[i][0], recordinfo[i][1]);}} else {for(int i = 0; i < count; i++) {printf("%s %d %d\n", recordname[i], recordinfo[i][0], recordinfo[i][1]);}}return 0;
}作者:来泡池子了的西红柿很奔放
链接:https://www.nowcoder.com/discuss/681233127540355072
来源:牛客网
20241030 18:00 - 20:18