user-0 提问: 程序报错，改不对了，能帮我看看怎么改吗

回复:
user: user-1
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-0
content: 引用 5 楼 user-3的回复:我觉得楼主的思维似乎受魔法流影响较大。 是否以为你定义了一堆数组，日志文件里的信息就会“自动”进入那些数组？  数组/变量名都是给人类看的，机器并不理解那些名字的含义，也不会“自动”填充那些数组。 咱还是回到现实科技侧，先落实一下语义，学习一下字符串拆分吧？  BTW: 其实学习一下Python，在引入适当的库的前提下，能够更好地兼容楼主的需求。 嗯嗯，谢谢，我知道了，我确实基础不好，谢谢指点

user: user-2
content: 引用 2 楼 SSyeah 的回复:[quote=引用 1 楼 自信男孩的回复:]        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不知道该怎么改了[/quote] 怎么改，要看你要实现什么，status是用于做什么的，再说上面也没对status赋值呢

user: user-0
content: 引用 1 楼 自信男孩的回复:        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不知道该怎么改了

user: user-2
content: for(i=0;i<line;i++)         {                 arr[line[i],status]++;                 vis[line[i],status]=1;         }         in 这个如何理解？ line是数组名，i < line是做什么， line[i]，status这个作为下标还有逗号，那么status是数组名呢，  这样的代码不符合语法规则，自然会提示编译错误。

user: user-3
content: 我觉得楼主的思维似乎受魔法流影响较大。 是否以为你定义了一堆数组，日志文件里的信息就会“自动”进入那些数组？  数组/变量名都是给人类看的，机器并不理解那些名字的含义，也不会“自动”填充那些数组。 咱还是回到现实科技侧，先落实一下语义，学习一下字符串拆分吧？  BTW: 其实学习一下Python，在引入适当的库的前提下，能够更好地兼容楼主的需求。

user: user-0
content: 引用 3 楼 自信男孩的回复:[quote=引用 2 楼 SSyeah 的回复:][quote=引用 1 楼 自信男孩的回复:]        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不知道该怎么改了[/quote] 怎么改，要看你要实现什么，status是用于做什么的，再说上面也没对status赋值呢[/quote] #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，但是可能不对，找不到问题出在哪了