C语言新手求助

SS哭辽 2021-02-27 05:15:09
题目要求是实现下面6个功能,我现在能写出的代码能实现前两个功能,和老师沟通过后,我代码存在的问题应该是没能把文件中信息存储在结构体中,我在代码中使用了strncpy_s函数,想把信息复制到结构体items中,但是后面的功能实现不了,已经卡在这里好久了,还是没有进步,能看看错在哪了吗?
(1)对日志文件进行列表读取和写入;
(2)计算日志文件中GET类型请求方式的占比;
(3)对访问状态码进行分析与统计,计算所有访问状态码的比率;
(4)分析访问最多的客户IP地址,并统计其访问次数;
(5)分析常用密码,并统计密码使用次数;
(6)用户输入时间段,查找该时间段内访问记录并输出到文件中


#include<stdio.h>
#include<string.h>
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];
char key[255];
char value[255];
char prams_cnt[255];
};
struct record items[2048];//所有记录
int items_cnt=0;//记录数
int main(void)
{
FILE *fp;
fp=fopen("access.log","r+");
if(!fp){
printf("false\n");
}
else{
printf("true\n");
}
int n=0,m=0;
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");
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);//输出所占百分比;
int fclose(FILE *fp);


fp=fopen("access.log","r+");
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(items[s].method,sizeof(items[s].method),line+pos[0]+1,pos1[0]-pos[0]-1);
strncpy_s(items[s].ip,sizeof(items[s].ip),line+pos[1]+1,pos1[1]-pos[1]-1);
strncpy_s(items[s].protocol,sizeof(items[s].protocol),line+pos[2]+1,pos1[2]-pos[2]-1);
strncpy_s(items[s].time,sizeof(items[s].time),line+pos[3]+1,pos1[3]-pos[3]-1);
strncpy_s(items[s].add,sizeof(items[s].add),line+pos[4]+1,pos1[4]-pos[4]-1);
strncpy_s(items[s].page,sizeof(items[s].page),line+pos[5]+1,pos1[5]-pos[5]-1);
strncpy_s(items[s].port,sizeof(items[s].port),line+pos[6]+1,pos1[6]-pos[6]-1);
strncpy_s(items[s].status,sizeof(items[s].status),line+pos[7]+1,pos1[7]-pos[7]-1);
strncpy_s(items[s].exploer_info,sizeof(items[s].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);
//结构体成员赋值
}

}
int fclose(FILE *fp);
fp=fopen("access.log","r+");
strncpy_s(items[2048],2048, line[2048]);
int maxi=0,maxn=0;
char arr[255]={0};
char vis[255]={0};
for(i=0;i<line[i];i++)
{
arr[items[i].status[i]]++;
vis[items[i].status[i]]=1;
if(maxn<vis[i])
{
maxn=vis[i];
maxi=i;
}
}
printf("%lf\n",1.0*arr[i]++/i);
printf("%lf",maxi);
int fclose(FILE *fp);
return 0;
}
...全文
623 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
源代码大师 2021-05-06
  • 打赏
  • 举报
回复
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html
qzjhjxj 2021-02-28
  • 打赏
  • 举报
回复
做完第四题,供参考:
//题目要求是实现下面6个功能,我现在能写出的代码能实现前两个功能,和老师沟通过后,我代码存在的问题应该
//是没能把文件中信息存储在结构体中,我在代码中使用了strncpy_s函数,想把信息复制到结构体items中,但是后面
//的功能实现不了,已经卡在这里好久了,还是没有进步,能看看错在哪了吗?
//(1)对日志文件进行列表读取和写入;
//(2)计算日志文件中GET类型请求方式的占比;
//(3)对访问状态码进行分析与统计,计算所有访问状态码的比率;
//(4)分析访问最多的客户IP地址,并统计其访问次数;
//(5)分析常用密码,并统计密码使用次数;
//(6)用户输入时间段,查找该时间段内访问记录并输出到文件中


#include<stdio.h>
#include<string.h>

struct record       //结构体
{
    char method[255];  //[GET POST]
    char ip[255];      //[233.102.79.50]
    char protocol[255];//[HTTP/1.1]
    char time[255];    //[2021-01-18 08:57:44]
    char add[255];     //[http://39.99.254.200:8810]
    char port[255];    //[/admin/login.jsp]
    char page[255];    //[passwd=admin123&&password=123456]
    char status[255];  //[403]
    char exploer_info[255];//[Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko]
};

struct record rec[2048];//文件有2048行

int main(void)
{

    char line[1024];
    int  i=0,n=0,k,j,max,j_pos,j_pos1,pos[9],pos1[9];

    FILE *fp;
    fp=fopen("access.log","r+");//打开文件
    if(!fp){
        printf("false\n");
        return -1;
    }
    else{
        printf("open file successful!\n");
    }
    while((fgets(line,1024,fp))!=NULL){
         j_pos=0,j_pos1=0;
         for(j=0;j<strlen(line);j++){
            if(line[j]=='[') {pos[j_pos]=j;  j_pos++;} //'[' 位置标记
            if(line[j]==']') {pos1[j_pos1]=j;j_pos1++;}//']' 位置标记
         }
         strncpy(rec[i].method,      (line+pos[0]+1),pos1[0]-pos[0]-1);
         strncpy(rec[i].ip,          (line+pos[1]+1),pos1[1]-pos[1]-1);
         strncpy(rec[i].protocol,    (line+pos[2]+1),pos1[2]-pos[2]-1);
         strncpy(rec[i].time,        (line+pos[3]+1),pos1[3]-pos[3]-1);
         strncpy(rec[i].add,         (line+pos[4]+1),pos1[4]-pos[4]-1);
         strncpy(rec[i].page,        (line+pos[5]+1),pos1[5]-pos[5]-1);
         strncpy(rec[i].port,        (line+pos[6]+1),pos1[6]-pos[6]-1);
         strncpy(rec[i].status,      (line+pos[7]+1),pos1[7]-pos[7]-1);
         strncpy(rec[i].exploer_info,(line+pos[8]+1),pos1[8]-pos[8]-1);
         i++;
    }
    fclose(fp);//关闭文件

    int *a = new int[i],*b = new int[i];// 统计数组申请
    memset(a,0,sizeof(int)*i);  //数组初始化
    memset(b,0,sizeof(int)*i);
    for(j=0;j<i;j++){
      if(strcmp(rec[j].method,"GET")==0)n++;//GET请求统计 第二题
      for(k=0;k<i;k++){
          if(strcmp(rec[j].status,rec[k].status)==0) b[j]++;//状态码进行分析统计 第三题
          if(strcmp(rec[j].ip,rec[k].ip)==0) a[j]++;  //分析统计访问最多的客户IP地址 第四题
      }
    }
    printf("输出GET请求所占比例:%6.3f\n",1.0*n/i);//输出GET请求所占百分比;
    max = a[0];k=0;
    for(j=0;j<i;j++){
        printf("rec[%d].status=%s:%6.3f\n",j,rec[j].status,b[j]*1.0/i);//输出所有访问状态码的比率
        if(max<a[j]) {max = a[j];k=j;} // 找到访问最多的客户IP地址次数 第四题
    }
    printf("访问最多的客户IP地址:%s,共访问:%d次\n",rec[k].ip,a[k]);//输出访问最多的客户IP地址及次数 第四题

    delete [] a; //释放数组
    delete [] b;



    //下面这段输出看看读入到rec[i]中的内容是否达预期目标,等程序调试完毕,这段可以删除:
//例子开始:
    for(j=0;j<i;j++)
     {
       printf("\n%s     %s     %s    %s    %s    %s     %s    %s     %s   \n",
       rec[j].method,rec[j].ip,    rec[j].protocol,
       rec[j].time,  rec[j].add,   rec[j].page,
       rec[j].port,  rec[j].status,rec[j].exploer_info);
     }
//例子结束
    
    return 0;
}

//open file successful!
//输出GET请求所占比例: 0.818
//rec[0].status=200: 0.909
//rec[1].status=200: 0.909
//rec[2].status=200: 0.909
//rec[3].status=412: 0.091
//rec[4].status=200: 0.909
//rec[5].status=200: 0.909
//rec[6].status=200: 0.909
//rec[7].status=200: 0.909
//rec[8].status=200: 0.909
//rec[9].status=200: 0.909
//rec[10].status=200: 0.909
//访问最多的客户IP地址:233.102.79.50,共访问:11次

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//POST     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         412     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//POST     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//请按任意键继续. . .
qzjhjxj 2021-02-28
  • 打赏
  • 举报
回复
只剩第6题,供参考:
//题目要求是实现下面6个功能,我现在能写出的代码能实现前两个功能,和老师沟通过后,我代码存在的问题应该
//是没能把文件中信息存储在结构体中,我在代码中使用了strncpy_s函数,想把信息复制到结构体items中,但是后面
//的功能实现不了,已经卡在这里好久了,还是没有进步,能看看错在哪了吗?
//(1)对日志文件进行列表读取和写入;
//(2)计算日志文件中GET类型请求方式的占比;
//(3)对访问状态码进行分析与统计,计算所有访问状态码的比率;
//(4)分析访问最多的客户IP地址,并统计其访问次数;
//(5)分析常用密码,并统计密码使用次数;
//(6)用户输入时间段,查找该时间段内访问记录并输出到文件中


#include<stdio.h>
#include<string.h>

struct record       //结构体
{
    char method[255];  //[GET POST]
    char ip[255];      //[233.102.79.50]
    char protocol[255];//[HTTP/1.1]
    char time[255];    //[2021-01-18 08:57:44]
    char add[255];     //[http://39.99.254.200:8810]
    char page[255];    //[/admin/login.jsp]
    char port[255];    //[passwd=admin123&&password=123456]
    char status[255];  //[403]
    char exploer_info[255];//[Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko]
};

struct record rec[2048];//文件有2048行

int main(void)
{

    char line[1024];
    int  i=0,j,j_pos,j_pos1,pos[9],pos1[9];

    FILE *fp;
    fp=fopen("access.log","r+");//打开文件
    if(!fp){
        printf("false\n");
        return -1;
    }
    else{
        printf("open file successful!\n");
    }
    while((fgets(line,1024,fp))!=NULL){
         j_pos=0,j_pos1=0;
         for(j=0;j<strlen(line);j++){
            if(line[j]=='[') {pos[j_pos]=j;  j_pos++;} //'[' 位置标记
            if(line[j]==']') {pos1[j_pos1]=j;j_pos1++;}//']' 位置标记
         }
         strncpy(rec[i].method,      (line+pos[0]+1),pos1[0]-pos[0]-1);
         strncpy(rec[i].ip,          (line+pos[1]+1),pos1[1]-pos[1]-1);
         strncpy(rec[i].protocol,    (line+pos[2]+1),pos1[2]-pos[2]-1);
         strncpy(rec[i].time,        (line+pos[3]+1),pos1[3]-pos[3]-1);
         strncpy(rec[i].add,         (line+pos[4]+1),pos1[4]-pos[4]-1);
         strncpy(rec[i].page,        (line+pos[5]+1),pos1[5]-pos[5]-1);
         strncpy(rec[i].port,        (line+pos[6]+1),pos1[6]-pos[6]-1);
         strncpy(rec[i].status,      (line+pos[7]+1),pos1[7]-pos[7]-1);
         strncpy(rec[i].exploer_info,(line+pos[8]+1),pos1[8]-pos[8]-1);
         i++;
    }
    fclose(fp);//关闭文件

    char buf[255],bufk[255];
    int n=0,m=0,k,q,max_ip,max_pw;
    int *a = new int[i],*b = new int[i],*p = new int[i];//统计数组
    memset(a,0,sizeof(int)*i);  //数组初始化
    memset(b,0,sizeof(int)*i);
    memset(p,0,sizeof(int)*i);
    for(j=0;j<i;j++){
      if(strcmp(rec[j].method,"GET")==0)n++;//GET请求统计    第2题
      if(strlen(rec[j].port)>0)m++;         //统计使用密码登录的次数 第5题
      sscanf(rec[j].port,"%*[^&&]&&%[^\n]",buf); //取密码字符段
      for(k=0;k<i;k++){                                                                                                 
          if(strcmp(rec[j].status,rec[k].status)==0) b[j]++;//状态码进行分析统计 第3题
          if(strcmp(rec[j].ip,    rec[k].ip)==0)     a[j]++;//分析统计访问最多的客户IP地址 第4题
          sscanf(rec[k].port,"%*[^&&]&&%[^\n]",bufk);
          if(strcmp(buf,bufk)==0&&(strlen(rec[j].port)>0)&&(strlen(rec[k].port)>0))p[j]++;// 分析常用密码  第5题
      }
    }
    printf("GET请求所占比例:%6.3f\n",1.0*n/i);//输出GET请求所占百分比; 第2题
    max_ip = a[0];max_pw = p[0];k=0;q=0;
    for(j=0;j<i;j++){
        printf("rec[%d].status=%s:%6.3f\n",j,rec[j].status,b[j]*1.0/i);//输出所有访问状态码的比率 第3题
        if(max_ip<a[j]) {max_ip=a[j];k=j;}    // 找到访问最多次数的客户IP 第4题
        if(max_pw<p[j]) {max_pw=p[j];q=j;}    // 找到使用次数最多的密码   第5题
    }
    printf("访问最多的客户IP地址:%s,共访问:%d次.\n",rec[k].ip,a[k]);//输出访问最多的客户IP地址及次数 第4题
    sscanf(rec[q].port,"%*[^&&]&&%[^\n]",buf);
    printf("常用密码:%s,被用了%d次.在%d次登录中,%d次用密码登录.\n",buf,max_pw,i,m); //rec[q].port 第5题
    delete [] a;delete [] b;delete [] p;     //释放数组


//下面这段输出看看读入到rec[i]中的内容是否达预期目标,等程序调试完毕,这段可以删除,也可改成第6题的代码
//例子开始:
    for(j=0;j<i;j++)
     {
       printf("\n%s     %s     %s    %s    %s    %s     %s    %s     %s   \n",
       rec[j].method,rec[j].ip,    rec[j].protocol,
       rec[j].time,  rec[j].add,   rec[j].page,
       rec[j].port,  rec[j].status,rec[j].exploer_info);
     }
//结束
    
    return 0;
}

//open file successful!
//GET请求所占比例: 0.818
//rec[0].status=200: 0.909
//rec[1].status=200: 0.909
//rec[2].status=200: 0.909
//rec[3].status=412: 0.091
//rec[4].status=200: 0.909
//rec[5].status=200: 0.909
//rec[6].status=200: 0.909
//rec[7].status=200: 0.909
//rec[8].status=200: 0.909
//rec[9].status=200: 0.909
//rec[10].status=200: 0.909
//访问最多的客户IP地址:233.102.79.50,共访问:9次.
//常用密码:password=123456,被用了6次.在11次登录中,8次用密码登录.

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123455    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//POST     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         412     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123466    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.51     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//POST     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.80.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//请按任意键继续. . .
qzjhjxj 2021-02-27
  • 打赏
  • 举报
回复
这是调试成功的把文件信息转存到结构体中的代码,并做了第二题。看了楼主上面的代码,感觉还是概念没搞清,建议仔细研究下面的代码,搞懂了,其余几题再往里加功能,无非就是对数组数据的统计分析,供参考:
//题目要求是实现下面6个功能,我现在能写出的代码能实现前两个功能,和老师沟通过后,我代码存在的问题应该
//是没能把文件中信息存储在结构体中,我在代码中使用了strncpy_s函数,想把信息复制到结构体items中,但是后面
//的功能实现不了,已经卡在这里好久了,还是没有进步,能看看错在哪了吗?
//(1)对日志文件进行列表读取和写入;
//(2)计算日志文件中GET类型请求方式的占比;
//(3)对访问状态码进行分析与统计,计算所有访问状态码的比率;
//(4)分析访问最多的客户IP地址,并统计其访问次数;
//(5)分析常用密码,并统计密码使用次数;
//(6)用户输入时间段,查找该时间段内访问记录并输出到文件中


#include<stdio.h>
#include<string.h>

struct record       //结构体
{
    char method[255];  //[GET POST]
    char ip[255];      //[ip]
    char protocol[255];//[HTTP/1.1]
    char time[255];    //[2021-01-18 08:57:44]
    char add[255];     //[http://39.99.254.200:8810]
    char port[255];    //[/admin/login.jsp]
    char page[255];    //[passwd=admin123&&password=123456]
    char status[255];  //[403]
    char exploer_info[255];//[Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko]
};

struct record rec[2048];//文件有2048行

int main(void)
{

    char line[1024];
    int  i=0,n=0,j,j_pos,j_pos1,pos[9],pos1[9];

    FILE *fp;
    fp=fopen("access.log","r+");//打开文件
    if(!fp){
        printf("false\n");
        return -1;
    }
    else{
        printf("open file successful!\n");
    }
    while((fgets(line,1024,fp))!=NULL){
         j_pos=0,j_pos1=0;
         for(j=0;j<strlen(line);j++){
            if(line[j]=='[') {pos[j_pos]=j;  j_pos++;} //'[' 位置标记
            if(line[j]==']') {pos1[j_pos1]=j;j_pos1++;}//']' 位置标记
         }
         strncpy(rec[i].method,      (line+pos[0]+1),pos1[0]-pos[0]-1);
         strncpy(rec[i].ip,          (line+pos[1]+1),pos1[1]-pos[1]-1);
         strncpy(rec[i].protocol,    (line+pos[2]+1),pos1[2]-pos[2]-1);
         strncpy(rec[i].time,        (line+pos[3]+1),pos1[3]-pos[3]-1);
         strncpy(rec[i].add,         (line+pos[4]+1),pos1[4]-pos[4]-1);
         strncpy(rec[i].page,        (line+pos[5]+1),pos1[5]-pos[5]-1);
         strncpy(rec[i].port,        (line+pos[6]+1),pos1[6]-pos[6]-1);
         strncpy(rec[i].status,      (line+pos[7]+1),pos1[7]-pos[7]-1);
         strncpy(rec[i].exploer_info,(line+pos[8]+1),pos1[8]-pos[8]-1);
         i++; //文件行数
    }
    fclose(fp);//关闭文件


    for(j=0;j<i;j++){
      if(strcmp(rec[j].method,"GET")==0)n++;//GET请求统计 第二题
    }
    printf("输出GET请求所占比例:%f\n",1.0*n/i);//输出日志文件内容并统计计数,输出所占百分比;



    //下面这段输出看看读入到rec[i]中的内容是否达预期目标,等程序调试完毕,这段可以删除:
//例子开始:
    for(j=0;j<i;j++)
     {
       printf("\n%s     %s     %s    %s    %s    %s     %s    %s     %s   \n",
       rec[j].method,rec[j].ip,    rec[j].protocol,
       rec[j].time,  rec[j].add,   rec[j].page,
       rec[j].port,  rec[j].status,rec[j].exploer_info);
     }
//结束
    
    return 0;
}

//open file successful!
//输出GET请求所占比例:0.818182

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//POST     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         412     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp         200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//POST     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko

//GET     233.102.79.50     HTTP/1.1    2021-01-18 08:57:44    http://39.99.254.200:8810    /admin/login.jsp     passwd=admin123&&password=123456    200     Mozilla/5.0 (Windows NT 10.0: WOW64: Trident/7.0: rv:11.0) like Gecko
//请按任意键继续. . .
Pale1c 2021-02-27
  • 打赏
  • 举报
回复
课设就自己加油吧
适合新手的教程,我自己也在学,以下是部分学习笔记 69 函数指针 70 动态内存分配 Dynamic memory pointer = new type pointer = new type [elements] 第一个表达式用来给一个单元素的数据类型分配内存。第二个表达式用来给一个数组分配内存。 例如: int * bobby; bobby = new int [5]; if (bobby == NULL) { // error assigning memory. Take measures. }; delete pointer; delete [ ] pointer; 在C语言中,为了动态分配内存,我们必须求助于函数库stdlib.h 因为该函数库在C++中仍然有效,并且在一些现存的程序仍然使用,所以我们下面将学习一些关于这个函数库中的函数用法。 函数malloc void * malloc (size_t nbytes); char * cp; cp = (char *) malloc (10); int * bobby; bobby = (int *) malloc (5 * sizeof(int)); 这一小段代码将一个指向可存储5个int型整数的内存块的指针赋给bobby,它的实际长度可能是 2,4或更多字节 数,取决于程序是在什么操作系统下被编译的。 int * bobby; bobby = (int *) calloc (5, sizeof(int)); malloc 和calloc的另一点不同在于calloc 会将所有的元素初始化为0。 它被用来改变已经被分配给一个指针的内存的长度。 void * realloc (void * pointer, size_t size); 参数pointer 用来传递一个已经被分配内存的指针或一个空指针,而参数size 用来指明新的内存长度。这个函数 给指针分配size 字节的内存。这个函数可能需要改变内存块的地址以便能够分配足够的内存来满足新的长度要 求。在这种情况下,指针当前所指的内存中的数据内容将会被拷贝到新的地址中,以保证现存数据不会丢失。函 数返回新的指针地址。如果新的内存尺寸不能够被满足,函数将会返回一个空指针,但原来参数中的指针 pointer 及其内容保持不变。 函数 free 这个函数用来释放被前面malloc, calloc 或realloc所分配的内存块。 void free (void * pointer); 注意:这个函数只能被用来释放由函数malloc, calloc 和realloc所分配的空间。 74 数据结构 76-78 结构指针(Pointers to structures) -> 这是一个引用操作符,常与结构或类的指针一起使用,以便引用其中的成员元素,这样就避免使用很多括号。例如,我们用: pmovie->title 来代替: (*pmovie).title 79 自定义数据类型(User defined data types) typedef existing_type new_type_name; typedef char C; typedef unsigned int WORD; typedef char * string_t; typedef char field [50]; 80 联合(Union) union mytypes_t { char c; int i; float f; } mytypes; 81 枚举Enumerations (enum) enum model_name { value1, value2, value3, . . } object_name; 例如,我们可以定义一种新的变量类型叫做color_t 来存储不同的颜色: enum colors_t {black, blue, green, cyan, red, purple, yellow, white}; 注意在这个定义里我们没有使用任何基本数据类型。换句话说,我们创造了一种的新的数据类型,而它并没有基 于任何已存在的数据类型:类型color_t,花括号{}中包括了它的所有的可能取值。例如,在定义了colors_t 列举 类型后,我们可以使用以下表达式: 84 类(Class) 类(class)是一种将数据和函数组织在同一个结构里的逻辑方法。定义类的关键字为class ,其功能与C语言中的struct类似,不同之处 是class可以包含函数,而不像struct只能包含数据元素。 类定义的形式是: class class_name { permission_label_1: member1; permission_label_2: member2; ... } object_name; 其中 class_name 是类的名称 (用户自定义的类型) ,而可选项object_name 是一个或几个对象(object)标识。Class的声明体中包含 成员members,成员可以是数据或函数定义,同时也可以包括允许范围标志 permission labels,范围标志可以是以下三个关键字中 任意一个:private:, public: 或 protected:。它们分别代表以下含义: ● private :class的private成员,只有同一个class的其他成员或该class的“friend” class可以访问这些成员。 ● protected :class的protected成员,只有同一个class的其他成员,或该class的“friend” class,或该class的子类(derived classes) 可以访问这些成员。 ● public :class的public成员,任何可以看到这个class的地方都可以访问这些成员。 如果我们在定义一个class成员的时候没有声明其允许范围,这些成员将被默认为 private范围。 以下是怎样读前面例子中出现的一些指针和类操作符 (*, &, ., ->, [ ]): ● *x 读作: pointed by x (由x指向的) ● &x 读作: address of x(x的地址) ● x.y 读作: member y of object x (对象x的成员y) ● (*x).y 读作: member y of object pointed by x(由x指向的对象的成员y) ● x->y 读作: member y of object pointed by x (同上一个等价) ● x[0] 读作: first object pointed by x(由x指向的第一个对象) ● x[1] 读作: second object pointed by x(由x指向的第二个对象) ● x[n] 读作: (n+1)th object pointed by x(由x指向的第n+1个对象) 由关键字struct和union定义的类 类不仅可以用关键字class来定义,也可以用struct或union来定义。 因为在C++中类和数据结构的概念太相似了,所以这两个关键字struct和class的作用几乎是一样的(也就是说在C++中struct定义的 类也可以有成员函数,而不仅仅有数据成员)。两者定义的类的唯一区别在于由class定义的类所有成员的默认访问权限为private,而 struct定义的类所有成员默认访问权限为public。除此之外,两个关键字的作用是相同的。 union的概念与struct和class定义的类不同, 因为union在同一时间只能存储一个数据成员。但是由union定义的类也是可以有成员函 数的。union定义的类访问权限默认为public。 94 操作符重载(Overloading operators) + - * / = < > += -= *= /= << >> <<= >>= == != <= >= ++ -- % & ^ ! | ~ &= ^= |= && || %= [] () new delete 96 this指针 97 静态成员(静态变量、静态函数)(Static members) 静态成员类直接访问,不属于类对象的成员 98 类之间的关系(Relationships between classes) 友元函数(Friend functions) 101 类的继承 记住,this 代表代码正在被执行的这一个对象的指针。 142 函数模块 154 出错处理 (Exception handling) 159 类型转换高级 (Advacned Class Type-casting) 163 typeid 164 预处理指令 168 标准函数库

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧