列表

详情


HJ19. 简单错误记录

描述

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


处理:


1、 记录最多8条错误记录,循环记录,最后只用输出最后出现的八条错误记录。对相同的错误记录只记录一条,但是错误计数增加。最后一个斜杠后面的带后缀名的部分(保留最后16位)和行号完全匹配的记录才做算是相同的错误记录。
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。也就是说,哪怕不同路径下的文件,如果它们的名字的后16个字符相同,也被视为相同的错误记录
4、循环记录时,只以第一次出现的顺序为准,后面重复的不会更新它的出现时间,仍以第一次为准

数据范围:错误记录数量满足 ,每条记录长度满足

输入描述

每组只包含一个测试用例。一个测试用例包含一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。

输出描述

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

示例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不会被记录。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 1ms, 内存消耗: 256KB, 提交时间: 2021-05-24

#include <stdio.h>
#include <string.h>

typedef struct _LIST_STR_T
{
    char name[200];
    int number;
    int times;
}LIST_STR_T;

int main(void)
{
    char in_str[200] = {0};
    int num = 0;
    int head = 0;
    int i = 0;
    int len = 0;
    LIST_STR_T list[100];
    char *p = NULL;
    memset(&list, 0, sizeof(list));
    
    while (scanf("%s %d", in_str, &num)!=EOF)
    {
        p = strrchr(in_str, '\\');
        len = strlen(++p);
        p = len>16?p+len-16:p;
        for (i = 0; i < head; i++)
        {
            if ((0 == strcmp(list[i].name, p))
                && (num == list[i].number))
            {
                break;
            }
        }
        if (i == head)
        {
            strcpy(list[head].name, p);
            list[head].number = num;
            ++list[head].times;
            ++head;
        }
        else
        {
            ++list[i].times;
        }
    }
    for (i = (head-8>0?head-8:0); i < head; i++)
    {
        printf("%s %d %d\n",list[i].name,list[i].number,list[i].times);
    }
}

C 解法, 执行用时: 1ms, 内存消耗: 328KB, 提交时间: 2021-10-16

#include <stdio.h>
#include <string.h>
int main(){
    char s1[200]={'\0'};
    char s2[200]={'\0'};
    char cc[8][17]={{"\0"}},cd[8][4]={{"\0"}};
    char chu[100][17]={{"\0"}},chd[100][4]={{"\0"}};
    int cf[8]={1,1,1,1,1,1,1,1};
    int mnt=0;
    while(scanf("%s",s1)!=EOF&&scanf("%s",s2)!=EOF){

        int flagt=0;
        int slen=strlen(s1);
        char ming[17]={'\0'};
        char mingc[50]={'\0'};
        int i=slen-1,ln=slen-1,count=0;
        for(;s1[i]!='\\'&&slen-i<=16;i--);
        for(;s1[ln]!='\\';ln--);//用不到的代码
        int p=0;
        
        for(i=i+1;i<slen;i++){
            ming[count++]=s1[i];
        }
        count=0;
        for(ln=ln+1;ln<slen;ln++){
            mingc[count++]=s1[ln];
        }
        strcpy(chu[mnt],ming);
        strcpy(chd[mnt],s2);
        mnt++;
        for(;p<mnt-1;p++){
            if(strcmp(chu[p],ming)==0&&strcmp(chd[p],s2)==0){
                for(count=0;count<8;count++){
                    if(strcmp(cc[count],ming)==0&&strcmp(cd[count],s2)==0){
                        
                        break;
                    }
                }
                if(count==8)
                        flagt=2;
                break;
            }
        }

        if(flagt==2) continue;
        
        if(strlen(cc[7])==0){
                strcat(cc[7],ming);
                strcat(cd[7],s2); 
                cf[7]=1;
        }
        else{
            int flag=0;
            for(count=0;count<8;count++){
                if(strcmp(cc[count],ming)==0&&strcmp(cd[count],s2)==0){
                    cf[count]=cf[count]+1;
                    flag=1;
                    break;
                }
            }
            if(flag==0){
            
                for(count=0;count<7;count++){

                    strcpy(cc[count],cc[count+1]);
                    strcpy(cd[count],cd[count+1]);
                    cf[count]=cf[count+1];
                }
                    strcpy(cc[count],ming);
                    strcpy(cd[count],s2);
                   cf[count]=1;
            }
        }
    }
    int j=0;
    for(j=0;j<8;j++){
        if(strlen(cc[j])!=0){
            printf("%s %s %d\n",cc[j],cd[j],cf[j]);

        }
    }
    
}

上一题