編譯器用的是dev-c++,調到了64 bit debug模式,運行結果不對,想除錯的時候會彈出一個視窗,再往下就除錯不了了,能幫我看一下那里出錯了嗎?
#include<stdio.h>
#include<string.h>
struct record//record為結構體名
{
char method[255];
char ip[255];
char protocol[255];
char time[255];
char add[255];
char port[255];
char page[255];
int status;
char exploer_info[255];
struct prams
{
char key[255];
char value[255];
};
int prams_cnt;
};//定義結構體
int main(void)
{
//struct record rec;
FILE *fp;
fp=fopen("access.log","r+");//打開檔案
if(!fp)
{
printf("false\n");
return -1;//直接回傳
}
else{
printf("true\n");
}//判斷檔案是否成功打開
char line[2048];
int i=0,x,j,j_pos,j_pos1;
int lines=0;
int pos[9],pos1[9];
char s='[';
char s1=']';
struct record rec;//定義結構體變數
printf("日志分析:\n");
int n=0,m=0;
while(fgets(line,2048,fp)!=NULL)
{
puts(line);
n++;
if(strncmp(line,"[GET]",5)==0)
{
m++;
}//比較兩字串,相等時strncmp函式值回傳0,計數
}
printf("輸出GET請求所占比例:%f\n",1.0*m/n);//輸出所占百分比;
struct record items[255];//所有記錄
int items_cnt=0;//記錄數
//輸出日志檔案內容并統計計數
char arr[1000]={0};
char vis[1000]={0};
for(i=0;i<n;i++)
{
arr[items[i].status]++;
vis[items[i].status]=1;
}
printf("%d",1.0*arr[i]++/i);
int maxi=0,maxn=0;
for(i=0;i<line[i];i++)
{
if(maxn<vis[i])
{
maxn=vis[i];
maxi=i;
}
}
while((fgets(line,2048,fp))!=NULL)
{
x=strlen(line);
j_pos=0,j_pos1=0;
for(j=0;j<x;j++)
{
if(line[j]==s)//此處為'['開始的位置
{
pos[j_pos]=j;
j_pos++;
}
if(line[j]==s1)//']'結束的位置
{
pos1[j_pos1]=j;
j_pos1++;
}
}
}
//strncpy_s函式的使用strncpy_s(char *str2,int size2,char *str1,int size1);
strncpy_s(rec.method,sizeof(rec.method),line+pos[0]+1,pos1[0]-pos[0]-1);
strncpy_s(rec.ip,sizeof(rec.ip),line+pos[1]+1,pos1[1]-pos[1]-1);
strncpy_s(rec.protocol,sizeof(rec.protocol),line+pos[2]+1,pos1[2]-pos[2]-1);
strncpy_s(rec.time,sizeof(rec.time),line+pos[3]+1,pos1[3]-pos[3]-1);
strncpy_s(rec.add,sizeof(rec.add),line+pos[4]+1,pos1[4]-pos[4]-1);
strncpy_s(rec.page,sizeof(rec.page),line+pos[5]+1,pos1[5]-pos[5]-1);
strncpy_s(rec.port,sizeof(rec.port),line+pos[6]+1,pos1[6]-pos[6]-1);
strncpy_s(rec.status,sizeof(rec.status),line+pos[7]+1,pos1[7]-pos[7]-1);
strncpy_s(rec.exploer_info,sizeof(rec.exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);
//結構體成員賦值
i++;
if(line[strlen(line)-1]=='\n')
{
lines++;
}
int fclose(FILE *fp);//關閉檔案
return 0;
}
uj5u.com熱心網友回復:
//printf("%d",1.0*arr[i]++/i);
printf("%lf",1.0*arr[i]++/i);對于浮點數值,用%d輸出是有問題的。
uj5u.com熱心網友回復:
先改錯,能通過了編譯再說。不要非法嵌套定義結構體。
你的status既然改成了int,就不要再套用strncpy處理它。否則就改回字符陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263051.html
標籤:C語言
下一篇:為什么編譯成功運行不出來
