user-0 提问: 求大佬帮忙看一下错在哪里了

回复:
user: user-1
content: 心急吃不了热豆腐，写代码，你得一步一步来，先实现主要的功能并验证，然后再加入进一步的功能，调试也是一样的。你把提供的代码编译运行下，看看能不能实现把文件中的内容搬到结构体数组中，如果能再往里加你想要的功能，如不能你得找出错误并修正它直到让它听你的：#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]; };  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  i=0,x,j,j_pos,j_pos1;//int  lines=0; //这个变量没用到     int  pos[9],pos1[9];     char s='[', s1=']';      struct record rec[4096];//预设文件有4096行      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(char * str2, int size2, char * str1, int size1);//这里char * str1, int size1 两个值楼主自己调试          strncpy_s(rec[i].method,      sizeof(rec[i].method),      line+pos[0]+1,pos1[0]-pos[0]-1);          strncpy_s(rec[i].ip,          sizeof(rec[i].ip),          line+pos[1]+1,pos1[1]-pos[1]-1);          strncpy_s(rec[i].protocol,    sizeof(rec[i].protocol),    line+pos[2]+1,pos1[2]-pos[2]-1);          strncpy_s(rec[i].time,        sizeof(rec[i].time),        line+pos[3]+1,pos1[3]-pos[3]-1);          strncpy_s(rec[i].add,         sizeof(rec[i].add),         line+pos[4]+1,pos1[4]-pos[4]-1);          strncpy_s(rec[i].page,        sizeof(rec[i].page),        line+pos[5]+1,pos1[5]-pos[5]-1);          strncpy_s(rec[i].port,        sizeof(rec[i].port),        line+pos[6]+1,pos1[6]-pos[6]-1);          strncpy_s(rec[i].status,      sizeof(rec[i].status),      line+pos[7]+1,pos1[7]-pos[7]-1);          strncpy_s(rec[i].exploer_info,sizeof(rec[i].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);          i++;       }     fclose(fp);//关闭文件      //全部读入rec[i]数组中，接下去处理的代码加入。     //举个例子：下面这段输出看看读入到rec[i]中的内容：     for(j=0;j<i;j++)      {        printf("%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; }

user: user-0
content: 引用 5 楼 qzjhjxj的回复:引用while(fgets(line,2048,fp)!=NULL)  {   puts(line);   n++;   if(strncmp(line,"[GET]",5)==0)   {    m++;   }//比较两字符串，相等时strncmp函数值返回0,计数   }  while((fgets(line,2048,fp))!=NULL)  {   x=strlen(line); 这里连着两个while{}循环体，第一个while循环结束，文件指针已经指向文件结束了，第二个while不会进入了。 嗷嗷，谢谢谢谢，我知道了

user: user-1
content: 引用int fclose(FILE *fp);//关闭文件 这也不是正确的关闭文件语句。

user: user-1
content: 引用while(fgets(line,2048,fp)!=NULL)  {   puts(line);   n++;   if(strncmp(line,"[GET]",5)==0)   {    m++;   }//比较两字符串，相等时strncmp函数值返回0,计数   }  while((fgets(line,2048,fp))!=NULL)  {   x=strlen(line); 这里连着两个while{}循环体，第一个while循环结束，文件指针已经指向文件结束了，第二个while不会进入了。

user: user-0
content: 引用 3 楼 qzjhjxj的回复:因为IDE不支持strncpy_s（）函数，所以我没法看运行结果，文字说明见注释，供参考：#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]; };  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  i=0,x,j,j_pos,j_pos1;//int  lines=0; //这个变量没用到     int  pos[9],pos1[9];     char s='[', s1=']';      struct record rec[4096];//预设文件有4096行      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(char * str2, int size2, char * str1, int size1);//这里char * str1, int size1 两个值楼主自己调试          strncpy_s(rec[i].method,sizeof(rec[i].method),line+pos[0]+1,pos1[0]-pos[0]-1);          strncpy_s(rec[i].ip,sizeof(rec[i].ip),line+pos[1]+1,pos1[1]-pos[1]-1);          strncpy_s(rec[i].protocol,sizeof(rec[i].protocol),line+pos[2]+1,pos1[2]-pos[2]-1);          strncpy_s(rec[i].time,sizeof(rec[i].time),line+pos[3]+1,pos1[3]-pos[3]-1);          strncpy_s(rec[i].add,sizeof(rec[i].add),line+pos[4]+1,pos1[4]-pos[4]-1);          strncpy_s(rec[i].page,sizeof(rec[i].page),line+pos[5]+1,pos1[5]-pos[5]-1);          strncpy_s(rec[i].port,sizeof(rec[i].port),line+pos[6]+1,pos1[6]-pos[6]-1);          strncpy_s(rec[i].status,sizeof(rec[i].status),line+pos[7]+1,pos1[7]-pos[7]-1);          strncpy_s(rec[i].exploer_info,sizeof(rec[i].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);          i++;          //if(line[strlen(line)-1]=='\n')          //{          //lines++;          //}       }     fclose(fp);//关闭文件      //全部读入rec[i]数组中，接下去处理的代码加入           return 0; } 我改了一下，但是运行结果是空白，而且不允许调试，将struct record rec[4096]一句和strncpy函数注释掉之后能运行，但是这样子是不是结构体就没用上，这是为什么啊？ #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[4096];//定义结构体变量   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,计数   }  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[i].method,sizeof(rec[i].method),line+pos[0]+1,pos1[0]-pos[0]-1);   strncpy_s(rec[i].ip,sizeof(rec[i].ip),line+pos[1]+1,pos1[1]-pos[1]-1);  strncpy_s(rec[i].protocol,sizeof(rec[i].protocol),line+pos[2]+1,pos1[2]-pos[2]-1);  strncpy_s(rec[i].time,sizeof(rec[i].time),line+pos[3]+1,pos1[3]-pos[3]-1);  strncpy_s(rec[i].add,sizeof(rec[i].add),line+pos[4]+1,pos1[4]-pos[4]-1);  strncpy_s(rec[i].page,sizeof(rec[i].page),line+pos[5]+1,pos1[5]-pos[5]-1);  strncpy_s(rec[i].port,sizeof(rec[i].port),line+pos[6]+1,pos1[6]-pos[6]-1);  strncpy_s(rec[i].status,sizeof(rec[i].status),line+pos[7]+1,pos1[7]-pos[7]-1);  strncpy_s(rec[i].exploer_info,sizeof(rec[i].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);  printf("输出GET请求所占比例：%f\n",1.0*m/n); int fclose(FILE *fp);//关闭文件  	return 0; }

user: user-1
content: 因为IDE不支持strncpy_s（）函数，所以我没法看运行结果，文字说明见注释，供参考：#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]; };  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  i=0,x,j,j_pos,j_pos1;//int  lines=0; //这个变量没用到     int  pos[9],pos1[9];     char s='[', s1=']';      struct record rec[4096];//预设文件有4096行      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(char * str2, int size2, char * str1, int size1);//这里char * str1, int size1 两个值楼主自己调试          strncpy_s(rec[i].method,sizeof(rec[i].method),line+pos[0]+1,pos1[0]-pos[0]-1);          strncpy_s(rec[i].ip,sizeof(rec[i].ip),line+pos[1]+1,pos1[1]-pos[1]-1);          strncpy_s(rec[i].protocol,sizeof(rec[i].protocol),line+pos[2]+1,pos1[2]-pos[2]-1);          strncpy_s(rec[i].time,sizeof(rec[i].time),line+pos[3]+1,pos1[3]-pos[3]-1);          strncpy_s(rec[i].add,sizeof(rec[i].add),line+pos[4]+1,pos1[4]-pos[4]-1);          strncpy_s(rec[i].page,sizeof(rec[i].page),line+pos[5]+1,pos1[5]-pos[5]-1);          strncpy_s(rec[i].port,sizeof(rec[i].port),line+pos[6]+1,pos1[6]-pos[6]-1);          strncpy_s(rec[i].status,sizeof(rec[i].status),line+pos[7]+1,pos1[7]-pos[7]-1);          strncpy_s(rec[i].exploer_info,sizeof(rec[i].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);          i++;          //if(line[strlen(line)-1]=='\n')          //{          //lines++;          //}       }     fclose(fp);//关闭文件      //全部读入rec[i]数组中，接下去处理的代码加入           return 0; }

user: user-0
content: 引用 1 楼 自信男孩的回复:struct record 这个结构体声明在哪里？没有看到呢。 生命后也是报错，并且会新增错误，原错误还存在

user: user-2
content: struct record 这个结构体声明在哪里？没有看到呢。