因為后續要求是要對訪問狀態碼進行分析統計,計算所有訪問狀態碼的比率,所以我就定義了很多陣列,可能是在遍歷陣列那里出錯了?編譯過不去,查過資料問題可能是陣列下標不合法,求大佬教教我
#include<stdio.h>
#include<string.h>
int main(void)
{
FILE *fp;
fp=fopen("access.log","r+");//打開檔案
if(!fp)
{
printf("false\n");
return -1;//直接回傳
}
else
{
printf("true\n");
}//判斷檔案是否成功打開
char line[2048];//定義和初始化字串
int n=0,m=0;
char method[255]={};
char ip[255]={};
char protocol[255]={};
char time[255]={};
char add[255]={};
char port[255]={};
char page[255]={};
char status[255]={};
char exploer_info[255]={};
char key[255]={};
char value[255]={};
char prams_cnt[255]={};//對字串進行定義和初始化
struct record
{
char method[255];
char ip[255];
char protocol[255];
char time[255];
char add[255];
char port[255];
char page[255];
char status[255];
char exploer_info[255];
struct prams
{
char key[255];
char value[255];
};
char prams_cnt[255];
};//將字串存入結構體中
while(fgets(line,2048,fp)!=NULL)
{
puts(line);
n++;
if(strncmp(line,"[GET]",5)==0)
{
m++;
}//比較兩字串,相等時strncmp函式值回傳0,計數
}//輸出日志檔案內容并統計計數
printf("%f",1.0*m/n);//輸出所占百分比
int arr[1000]={0};
int vis[1000]={0};
int i;
for(i=0;i<line;i++)
{
arr[line[i],status]++;
vis[line[i],status]=1;
}
int fclose(FILE *fp);//關閉檔案
return 0;
}

uj5u.com熱心網友回復:
for(i=0;i<line;i++)
{
arr[line[i],status]++;
vis[line[i],status]=1;
}
in
這個如何理解?
line是陣列名,i < line是做什么,
line[i],status這個作為下標還有逗號,那么status是陣列名呢,
這樣的代碼不符合語法規則,自然會提示編譯錯誤。
uj5u.com熱心網友回復:
我把line改正為line[i]后,程式的warning沒有了,但是后面的status不知道該怎么改了
uj5u.com熱心網友回復:
怎么改,要看你要實作什么,status是用于做什么的,再說上面也沒對status賦值呢
uj5u.com熱心網友回復:
for(i=0;i<line;i++)
{
arr[line[i],status]++;
vis[line[i],status]=1;
}
in
這個如何理解?
line是陣列名,i < line是做什么,
line[i],status這個作為下標還有逗號,那么status是陣列名呢,
這樣的代碼不符合語法規則,自然會提示編譯錯誤。
我把line改正為line[i]后,程式的warning沒有了,但是后面的status不知道該怎么改了
怎么改,要看你要實作什么,status是用于做什么的,再說上面也沒對status賦值呢
#include<stdio.h>
#include<string.h>
int main(void)
{
FILE *fp;
fp=fopen("access.log","r+");//打開檔案
if(!fp)
{
printf("false\n");
return -1;//直接回傳
}
else{
printf("true\n");
}//判斷檔案是否成功打開
char line[2048];//定義和初始化字串
int n=0,m=0;
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]={};
char key[255]={};
char value[255]={};
char prams_cnt[255]={};//對字串進行定義和初始化
struct 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];
};
char prams_cnt[255];
};//將字串存入結構體中
while(fgets(line,2048,fp)!=NULL)
{
puts(line);
n++;
if(strncmp(line,"[GET]",5)==0)
{
m++;
}//比較兩字串,相等時strncmp函式值回傳0,計數
}//輸出日志檔案內容并統計計數
printf("%f\n",1.0*m/n);//輸出所占百分比
char arr[1000]={0};
char vis[1000]={0};
int i;
for(i=0;i<line[i];i++)
{
arr[line[i],status]++;
vis[line[i],status]=1;
}
printf("%d",1.0*arr[i]++/i);
int fclose(FILE *fp);//關閉檔案
return 0;
}
改后的程式是這樣的,更改status型別為整數后就沒有報錯了,但是運行結果還是不對,除錯發現沒有進入for回圈,i一直是0,
想要實作的功能是計算日志檔案中的所有訪問狀態碼的比率,所以這里用的status,但是可能不對,找不到問題出在哪了
uj5u.com熱心網友回復:
我覺得樓主的思維似乎受魔法流影響較大。是否以為你定義了一堆陣列,日志檔案里的資訊就會“自動”進入那些陣列?
陣列/變數名都是給人類看的,機器并不理解那些名字的含義,也不會“自動”填充那些陣列。
咱還是回到現實科技側,先落實一下語意,學習一下字串拆分吧?
BTW:
其實學習一下Python,在引入適當的庫的前提下,能夠更好地兼容樓主的需求。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262211.html
標籤:C語言
