题目描述
开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。
处理:
1、记录最多8条错误记录,循环记录(或者说最后只输出最后出现的八条错误记录),对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加;
2、 超过16个字符的文件名称,只记录文件的最后有效16个字符;
3、 输入的文件可能带路径,记录文件名称不能带路径。
输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
输出描述:
将所有的记录统计并将结果输出,格式:文件名 代码行数 数目,一个空格隔开
示例1
输入
E:\V1R2\product\fpgadrive.c 1325
输出
fpgadrive.c 1325 1
题解:
思路:这道题如果只是满足示例的输出那还是挺简单的,但满足题目的要求,就复杂很多。具体参见代码中的注释
# coding=utf-8
import sys
import re
arr=[]
res=[]
while True:
count=len(res)
line=sys.stdin.readline()
if line == '\n':
break
line = line.strip('\n')
#文件名和行数之间可能不只一个空格,所以用了正则表达式
row = re.split(r" +", line)
#'\\'应该是python对'\'做了转义处理
name=row[0].split('\\')[-1]
#对相同的错误记录(净文件名称和行号完全匹配)只记录一条,错误计数增加,arr列表就是为了在这里使用才定义的
if arr.count(name+' '+row[1])>0:
idx=arr.index(name+' '+row[1])
ch=res[idx].split(' ')
res[idx]=ch[0]+' '+ch[1]+' '+str(int(ch[-1])+1)
else:
#超过16个字符的文件名称,只记录文件的最后有效16个字符
if len(name)>16:
name=name[-16:]
arr.append(name+' '+row[1])
res.append(name+' '+row[1]+' '+'1')
#记录最多8条错误记录,循环记录(或者说最后只输出最后出现的八条错误记录)
if count == 9:
res.pop(0)
for ch in res:
print(ch)
输入参考用例:
E:\V1R2\product\fpgadrive1.c 1325
E:\V1R2\product\fpgadrive2.c 1325
E:\V1R2\product\fpgadrive3.c 1325
E:\V1R2\product\fpgadrive4.c 1325
E:\V1R2\product\fpgadrive5.c 1325
E:\V1R2\product\fpgadrive6.c 1325
E:\V1R2\product\fpgadrive3.c 1325 #该行同3
E:\V1R2\product\fpgadrive7.c 1325
E:\V1R2\product\fpgadrive8.c 1325
E:\V1R2\product\fpgadrive7.c 1325 #该行同7,但过了8进入滚动记录
E:\V1R2\product\fpgadoubledrive3.c 1325 #文件名超过16个字符
E:\V1R2\product\fpgadrive7.c 1325 #该行同7,验证错误叠加
参考用例输出:
fpgadrive2.c 1325 1
fpgadrive3.c 1325 2
fpgadrive4.c 1325 1
fpgadrive5.c 1325 1
fpgadrive6.c 1325 1
fpgadrive7.c 1325 3
fpgadrive8.c 1325 1
gadoubledrive3.c 1325 1
说明:
目前本King的代码能力只能按上述方式实现,后续有更好的方案,欢迎各位指点,也会不定期做修改~