因此,我被要求编写一个程序,该程序获取学生姓名和分数的列表并计算平均分数。您需要声明两个名为名称和标记的数组。假设学生人数为 5。
声明数组名:(使用二维数组) 字符名称[num_std][name_len]; //名称长度可以是20个字符
声明数组标记: 浮动标记[num_std];
让我烦恼的是,当我尝试运行调用名称和标记的循环时,我不知道为什么会得到空值。而且我也想知道以这种方式对我的二维数组进行编码是否正确? 抱歉,我对二维数组还是个新手,这让我很困惑。
有人可以给我写一个完整的代码,因为我想指出我错在哪里。 非常感谢:D
///////////////////////代码////////////////////// /
#include <stdio.h>
int main ()
{
int n,i;
char num_std;
char name_len[20];
char name[num_std][name_len[20]];
float sum = 0,marks [5];
for (n=0;n<5;n++)
{
printf("\nEnter student name:");
scanf("%s",&name[n][1]);
printf("Enter student marks:");
scanf("%f",&marks[n]);
sum += marks[n];
}
for(n=1;n<5;n++)
{
printf("%s %f",name[n][1],marks[n]);
}
float average = sum/5.0;
printf("\nAverage mark of 5 students = %.2f",average);
return 0;
}
//////////////////输出///////////////////////
Enter student name:Brian Enter student marks:99 Enter student name:Edward Enter student marks:79 Enter student name:Fred Enter student marks:69 Enter student name:Adrian Enter student marks:45 Enter student name:Smith Enter student marks:55 (null) 45.000000 Average mark of 5 students = 69.40 Process returned 35 (0x23) execution time : 40.064 s Press any key to continue.
答案 0 :(得分:1)
你的代码是如何出错的:
#include <stdio.h>
int main ()
{
/* i is declared but not used (legal) */
int n,i;
char num_std;
char name_len[20];
/* uninitialized variable num_std is used as array length (critical) */
/* out-of-range name_len[20] is used (critical) */
char name[num_std][name_len[20]];
float sum = 0,marks [5];
for (n=0;n<5;n++)
{
printf("\nEnter student name:");
/* the first element of the array name[n] is not used (legal) */
scanf("%s",&name[n][1]);
printf("Enter student marks:");
scanf("%f",&marks[n]);
sum += marks[n];
}
/* indentation is broken (legal) */
/* the first data is not printed (legal) */
for(n=1;n<5;n++)
{
/* char (name[n][1]) is passed where char* is required (critical) */
/* data is printed without being separated (legal) */
printf("%s %f",name[n][1],marks[n]);
}
float average = sum/5.0;
/* newline character is not printed at end of output (legal) */
printf("\nAverage mark of 5 students = %.2f",average);
return 0;
/* but indentation is broken (legal) */
}
这里的“关键”意味着错误会引发未定义行为,“合法”意味着错误不会引发未定义行为但行为可能不是什么想要或不典型。
固定代码:
#include <stdio.h>
int main (void)
{
int n;
char name[5][21]; /* 20-character name + 1 terminating null-character */
float sum = 0,marks [5];
for (n=0;n<5;n++)
{
printf("\nEnter student name:");
scanf("%20s",name[n]); /* specify length limit to avoid buffer overrun */
printf("Enter student marks:");
scanf("%f",&marks[n]);
sum += marks[n];
}
for(n=0;n<5;n++)
{
printf("%s %f\n",name[n],marks[n]);
}
float average = sum/5.0;
printf("\nAverage mark of 5 students = %.2f\n",average);
return 0;
}
答案 1 :(得分:0)
char name[num_std][name_len[20]];
是错误的。 name_len
是一个包含 20 个元素的数组,因此这些元素的索引范围为 0 到 19。访问 name_len[20]
是不正确的。此外,此时 name_len
中的任何元素都没有被赋予值。 C 标准允许在程序执行期间设置长度的数组,但必须在定义数组时给出长度。它不能是一个随着变量变化而调整的长度。在您学习的这一点上,将长度更改为给定的最大值:char name[num_std][21];
。 21 个数组元素(每个元素一个 char
)允许名称中有 20 个字母加上一个空字符来标记结尾。 (稍后您将学习管理多个不同长度的字符串的其他方法。)
您还需要在此定义之前给 num_std
一个值。目前尚不清楚该值应该是多少。程序的其他部分是为五个学生硬编码的。在这种情况下,您可以使用 num_std
定义 char num_std = 5;
。在这样的分配中,程序通常会首先从输入中读取 num_std
。在这种情况下,您需要在 scanf
行之前使用 num_std
来读取 char name[num_std][21];
。
scanf("%s",&name[n][1]);
是错误的。我们想将字符串放在名称空格的开头,该空格以 name[n][0]
开头,而不是 name[n][1]
。所以你可以使用&name[n][0]
。表达式 name[n]
将具有相同的值,因为在 C 中,表达式中的数组会自动转换为指向其第一个元素的指针(除非用作 sizeof
的操作数或一元 {{1 }} 或作为初始化数组的字符串字面量)。
在 &
中,您还应该使用 printf("%s %f",name[n][1],marks[n]);
,并且您再次需要传递其地址,name[n][0]
或 &name[n][0]
。