題目描述:
開發一個簡單錯誤記錄功能小模塊,能夠記錄出錯的代碼所在的文件名稱和行號。
處理:
1、 記錄最多8條錯誤記錄,循環記錄,對相同的錯誤記錄(淨文件名稱和行號完全匹配)只記錄一條,錯誤計數增加;
2、 超過16個字符的文件名稱,只記錄文件的最後有效16個字符;
3、 輸入的文件可能帶路徑,記錄文件名稱不能帶路徑。
輸入描述:
一行或多行字符串。每行包括帶路徑文件名稱,行號,以空格隔開。
輸出描述:
將所有的記錄統計並將結果輸出,格式:文件名 代碼行數 數目,一個空格隔開,如:
示例1
輸入
複製
E:\V1R2\product\fpgadrive.c 1325
輸出
複製
fpgadrive.c 1325 1
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
typedef struct {
char str[200];
int num;
int count;
}error_log;
int main(){
char str[1000];
int i,j,k,len,arrcnt=0;
error_log *log[1000],*temp;
char *p;
temp=(error_log *)malloc(sizeof (error_log));
while(scanf("%s %d",temp->str,&(temp->num))!=EOF)
{
p=strrchr(temp->str,'\\');
p=p+1;
len=strlen(p);
if(len>16)
p=p+len-16;
for(i=0;i<arrcnt;i++)
{
if(strcmp(log[i]->str,p)==0)
{
if(log[i]->num==temp->num)
{
(log[i]->count)++;
break;//這裏break 的意思是,如果有一樣的,那麼就跳出直接終止
//也就只可能出現相同的一次,後面不可能還有一模一樣的。
//同時這裏的i也沒有++,所以後面是不會把他寫進數組裏面的
}
}
}
if(arrcnt==i)
{
log[arrcnt]=(error_log *)malloc(sizeof (error_log));//把傳輸進來的每個字符串
//都複製到log數組中
strcpy(log[arrcnt]->str,p);
log[arrcnt]->num=temp->num;
log[arrcnt]->count=1;
arrcnt++;
}
}
if(arrcnt>8)
j=arrcnt-8;//同樣的這裏也是,如果超過8那麼就取後面的8個。
else j=0;
for(;j<arrcnt;j++)
printf("%s %d %d\n",log[j]->str, log[j]->num,log[j]->count);
return 0;
}
在這個代碼中只是以文件名的後16個字符爲判斷條件,並不檢查前面是否一樣。就把它們歸爲一樣了。