user-0 提问: 一个统计学生的c，编译没报错，运行错误。

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: /*这是一个查询学生成绩的程序，查询数学，英语，语文，计算并算出总成绩*/ /*首先，显示输入学生人数，然后显示输入各科成绩，最后按照学号排序输出各科 成绩。最后计算并显示出各科成绩的平均值，最大值，最小值*/ /*在main函数中既有printf1函数，scanf函数，printf2函数,arg函数，min函数 max函数*/ void input(double s[][4], int n); void output(double s[][4], int n); double max1(double s[][4], int n, int i); double min1(double s[][4], int n, int i); double avg(double s[][4], int n, int i); int main() { 	int i, number; 	double grade[100][4]; 	char pro[4][10] = { "数学", "英语", "语文", "总成绩" }; 	printf("请输入学生的人数:"); 	scanf("%d", &number); 	input(grade, number); 	output(grade, number); 	for (i = 0; i <= 4; ++i)//这里数组越界了 	{ 		printf("%s最高成绩为%.2f\n", pro[i], max1(grade, number, i)); 		printf("%s最低成绩为%.2f\n", pro[i], min1(grade, number, i));//多了一个%s 		printf("%s平均成绩为%.2f\n", pro[i], avg(grade, number, i)); 		printf("\n"); 	} 	return 0; }  void input(double s[][4], int n) { 	printf("输入学生的成绩按照（高数，英语，c语言的次序输入)\n"); 	/*转义字符*/ 	int i; 	int a, b, c; 	printf("%d\n", n); 	for (i = 0; i<n; i++) 	{ 		//scanf("%f %f %f", &a, &b, &c);//没加& 		//s[i][0] = a; 		//s[i][1] = b; 		//s[i][2] = c; 		scanf("%lf %lf %lf", &s[i][0], &s[i][1], &s[i][2]);//没加& 		s[i][3] = s[i][2] + s[i][1] + s[i][0]; 	} 	printf("%d\n", i); } void output(double s[][4], int n) { 	printf("输入的学生成绩为：\n"); 	printf("学号\t高数\t英语\tc语言\t总分\n"); 	int i; 	for (i = 0; i<n; i++) 	{ 		printf("%d\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n", i, s[i][0], s[i][1], s[i][2], s[i][3]);//多了一个反斜杠 	} } double max1(double s[][4], int n, int j) { 	double m = s[0][j]; 	int i; 	for (i = 1; i<n; i++) 	if (m<s[i][j]) 		m = s[i][j]; 	return m; } double min1(double s[][4], int n, int j) { 	double m = s[0][j]; 	int i; 	for (i = 1; i<n; i++) 	if (m > s[i][j]) 		m = s[i][j]; 	return m; } double avg(double s[][4], int n, int j) { 	double sum = s[0][j]; 	int i; 	for (i = 1; i<n; i++) 		sum += s[i][j]; 	return sum / n; } 帮楼主改了改，有问题的地方都添加了注释。楼主可以参考

user: user-3
content: 一些细节上面的错误，取地址符号，if语句的判断条件，循环的次数导致溢出 我也是初学，这只是个人看法，不一定正确，供参考

user: user-3
content: #include<stdio.h>  /*这是一个查询学生成绩的程序，查询数学，英语，语文，计算并算出总成绩*/  /*首先，显示输入学生人数，然后显示输入各科成绩，最后按照学号排序输出各科  成绩。最后计算并显示出各科成绩的平均值，最大值，最小值*/  /*在main函数中既有printf1函数，scanf函数，printf2函数,arg函数，min函数  max函数*/  void input(double s[][4],int n);  void output(double s[][4],int n); double max(double s[][4],int n,int i);   double min(double s[][4],int n,int i); double avg(double s[][4],int n,int i);  int main()  { 	int i,number; 	double grade[100][4]; 	char pro[4][10]={"数学","英语","语文","总成绩"}; 	printf("请输入学生的人数:") ; 	scanf("%d",&number); 	input(grade,number); 	output(grade,number); 	for(i=0;i<4;++i) 	{ 		printf("%s最高成绩为%.2f",pro[i],max(grade,number,i)); 		printf("%s最低成绩为%.2f",pro[i],min(grade,number,i)); 		printf("%s平均成绩为%.2f",pro[i],avg(grade,number,i)); 		printf("\n"); 	} 	return 0; }  void input(double s[][4],int n) { 	printf("输入学生的成绩按照(高数，英语，语文的次序输入)\n"); 	/*转义字符*/  	int i; 	for(i=0;i<n;i++) 	{ 		scanf("%lf %lf %lf",&s[i][0],&s[i][1],&s[i][2]); 		s[i][3]=s[i][2]+s[i][1]+s[i][0]; 	} } void output(double s[][4],int n) { 	printf("输入的学生成绩为：\n"); 	printf("学号\t高数\t英语\t语文\t总分\n"); 	int i; 	for(i=0;i<n;i++) 	{ 		printf("%d\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n",i+1,s[i][0],s[i][1],s[i][2],s[i][3]); 	} } double max(double s[][4],int n,int j) { 	double m=s[0][j]; 	int i; 	for(i=1;i<n;i++) 	{ 		if(m<s[i][j]) 			m=s[i][j]; 	} 	return m; } double min(double s[][4],int n,int j) { 	double m=s[0][j]; 	int i; 	for(i=1;i<n;i++) 	{ 		if(m>s[i][j]) 			m=s[i][j]; 	} 	return m; } double avg(double s[][4],int n,int j) { 	double sum= s[0][j]; 	int i; 	for(i=1;i<n;i++) 		sum+=s[i][j]; 	return sum/n; }

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-4
content: 编译没报错说明没有语法错误，但是运行时又出错了，说明是程序的逻辑错误，调试一下看看

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-5
content: 引用 7 楼 qq_26440903 的回复:[quote=引用 3 楼 ghx287524027的回复:]input()函数中scanf("%1f %1f %1f",&s[i][0],&s[i][1],s[i][2]);“,s[i][2]”缺少取地址符号，所以会报越界错误。 另外，局部变量定义时最好进行赋值，否则其值是不固定的。 我改了，编译没问题，可是运行他说学生别成绩.exe已经停止运行[/quote]  在调试时运行，出错点中断，然后通过调用堆栈、变量窗口等观察分析原因

user: user-0
content: 引用 3 楼 ghx287524027的回复:input()函数中scanf("%1f %1f %1f",&s[i][0],&s[i][1],s[i][2]);“,s[i][2]”缺少取地址符号，所以会报越界错误。 另外，局部变量定义时最好进行赋值，否则其值是不固定的。 我改了，编译没问题，可是运行他说学生别成绩.exe已经停止运行

user: user-0
content: 引用 2 楼 虚空大鸟的回复:引用 1楼我是你的主体 的回复:哪里出问题了呢？，谢谢你的pro初始化有问题，还有你运行时报的什么错 学生成绩.exe停止运行。

user: user-5
content: 少了个& scanf("%1f %1f %1f",&s[i][0],&s[i][1],&s[i][2]);

user: user-6
content: input()函数中scanf("%1f %1f %1f",&s[i][0],&s[i][1],s[i][2]);“,s[i][2]”缺少取地址符号，所以会报越界错误。 另外，局部变量定义时最好进行赋值，否则其值是不固定的。

user: user-7
content: 引用 1楼我是你的主体 的回复:哪里出问题了呢？，谢谢你的pro初始化有问题，还有你运行时报的什么错

user: user-8
content: 修改如下：  #include <stdio.h> /*这是一个查询学生成绩的程序，查询数学，英语，语文，计算并算出总成绩*/ /*首先，显示输入学生人数，然后显示输入各科成绩，最后按照学号排序输出各科 成绩。最后计算并显示出各科成绩的平均值，最大值，最小值*/ /*在main函数中既有printf1函数，scanf函数，printf2函数,arg函数，min函数 max函数*/ void input(double s[][4], int n); void output(double s[][4], int n); double max(double s[][4], int n, int i); double min(double s[][4], int n, int i); double avg(double s[][4], int n, int i); int main() { 	int i, number; 	double grade[100][4]; 	char pro[4][10] = { "数学","英语","语文","总成绩" }; 	printf("请输入学生的人数:"); 	scanf("%d", &number); 	input(grade, number); 	output(grade, number); 	for (i = 0; i <= 4; ++i) 	{ 		printf("%s最高成绩为%.2f", pro[i], max(grade, number, i)); 		printf("%s最低成绩为%.2f", min(grade, number, i)); 		printf("%s平均成绩为%.2f", avg(grade, number, i)); 		printf("\n"); 	} 	return 0; } void input(double s[][4], int n) { 	printf("输入学生的成绩按照(高数，英语，c语言的次序输入)\n"); 	/*转义字符*/ 	int i; 	for (i = 0; i<n; i++) 	{ 		//scanf("%1f %1f %1f", &s[i][0], &s[i][1], s[i][2]); 		scanf("%1f%1f%1f", &s[i][0], &s[i][1], &s[i][2]);     //zx 		s[i][3] = s[i][2] + s[i][1] + s[i][0]; 	} } void output(double s[][4], int n) { 	printf("输入的学生成绩为：\n"); 	printf("学号\t高数\t英语\tc语言\t总分\n"); 	int i; 	for (i = 0; i<n; i++) 	{ 		printf("%d\t%.1lf\t%.1lf\t%.1lf\t%.1lf\n", i, s[i][0], s[i][1], s[i][2], s[i][3]); 	} } double max(double s[][4], int n, int j) { 	double m = s[0][j]; 	int i; 	for (i = 1; i < n; i++) 		if (m < s[i][j]) 			m = s[i][j]; 	return m; } double min(double s[][4], int n, int j) { 	double m = s[0][j]; 	int i; 	for (i = 1; i < n; i++) 		//if (m + s[i][j]) 		if (m > s[i][j])   //zx 			m = s[i][j]; 	return m; } double avg(double s[][4], int n, int j) { 	double sum = s[0][j]; 	int i; 	for (i = 1; i < n; i++) 		sum += s[i][j]; 	return sum / n; }

user: user-0
content: 哪里出问题了呢？，谢谢