我寫的程式想統計日志檔案里所有get的數量并求所占百分比,但是求百分比的這一段程式不能輸出,還顯示一個warning,查過資料顯示這個warning的意思是缺少頭檔案,但是我沒能找到是哪里出了問題,求懂的人幫忙看一下
#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 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(getc(fp)!=EOF)
{
fgets(method,1000,fp);
fgets(ip,1000,fp);
fgets(protocol,1000,fp);
fgets(time,1000,fp);
fgets(add,1000,fp);
fgets(port,1000,fp);
fgets(page,1000,fp);
fgets(status,1000,fp);
fgets(exploer_info,1000,fp);
fgets(key,1000,fp);
fgets(value,1000,fp);
fgets(prams_cnt,1000,fp);
printf("%s",method);
printf("%s",ip);
printf("%s",protocol);
printf("%s",time);
printf("%s",add);
printf("%s",port);
printf("%s",page);
printf("%s",status);
printf("%s",exploer_info);
printf("%s",key);
printf("%s",value);//將日志檔案輸出
};
int i=0,n=0;
for(i=0;i<1000;i++)
{
if (method[i]="[GET]")
{
n++;
}
};
double pro=0.0;
pro=1.0*i/n;
printf("%f",pro);
int fclose(FILE *fp);
return 0;
}

uj5u.com熱心網友回復:
if (method[i]="[GET]")這句是要判斷method[i]=="[GET]"嗎?字串應該這樣判斷:
#include<string.h> //頭檔案
if(strcmp(method[i],"[GET]")==0)
uj5u.com熱心網友回復:
#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 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(getc(fp)!=EOF)
{
/* //可能出現記憶體溢位
fgets(method,1000,fp);
fgets(ip,1000,fp);
fgets(protocol,1000,fp);
fgets(time,1000,fp);
fgets(add,1000,fp);
fgets(port,1000,fp);
fgets(page,1000,fp);
fgets(status,1000,fp);
fgets(exploer_info,1000,fp);
fgets(key,1000,fp);
fgets(value,1000,fp);
fgets(prams_cnt,1000,fp);
*/
fgets(method, sizeof(method),fp);
fgets(ip, sizeof(ip),fp);
fgets(protocol,sizeof(protocol),fp);
fgets(time, sizeof(time),fp);
fgets(add, sizeof(add),fp);
fgets(port, sizeof(port),fp);
fgets(page, sizeof(page),fp);
fgets(status, sizeof(status), fp);
fgets(exploer_info, sizeof(exploer_info), fp);
fgets(key, sizeof(key), fp);
fgets(value, sizeof(value), fp);
fgets(prams_cnt, sizeof(prams_cnt), fp);
printf("%s",method);
printf("%s",ip);
printf("%s",protocol);
printf("%s",time);
printf("%s",add);
printf("%s",port);
printf("%s",page);
printf("%s",status);
printf("%s",exploer_info);
printf("%s",key);
printf("%s",value);//將日志檔案輸出
}//;
int i=0,n=0;
/*
for(i=0;i<1000;i++)
{
//if (method[i]="[GET]")
if (strcmp(method, "[GET]") == 0)
{
n++;
}
};
*/
if (strcmp(method, "[GET]") == 0)
{
n++;
}
double pro=0.0;
pro=1.0*i/n;
printf("%f",pro);
int fclose(FILE *fp);
return 0;
}
供參考~
uj5u.com熱心網友回復:
要做這點事定義那么多亂七八糟的東西干啥,抓一行,比較前5個字符,回圈。
#include<stdio.h>
#include<string.h>
int main(void)
{
char line[2048];
FILE *fp;
int n=0, m=0;
fp = fopen("access.log", "r");
if (!fp) {
printf("false\n");
return -1;//直接回傳
}
while (fgets(line,2048,fp) != NULL)
{
//puts(line); //需要的話去掉行首的雙斜線輸出
n++;
if (strncmp(line, "[GET]", 5) == 0)m++;
}
printf("%.4lf", 1.0*m/n);
fclose(fp);
return 0;
}
uj5u.com熱心網友回復:
事實上樓主的代碼里每個fgets都抓進來一整行,而不是你自己設想的一個欄位,因此該代碼缺少正確的前提。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261114.html
標籤:C語言
