C 有人能告诉我为什么这不是';不行吗?
所以我正在做一个程序,扫描一些学生的名字和成绩,然后给我看所有平均成绩为85+的学生。 我需要使用结构,指令中说我必须借助strlen函数为名称动态分配内存C 有人能告诉我为什么这不是';不行吗?,c,C,所以我正在做一个程序,扫描一些学生的名字和成绩,然后给我看所有平均成绩为85+的学生。 我需要使用结构,指令中说我必须借助strlen函数为名称动态分配内存 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct stud { char *name; int marks[4]; float avg; }student; student* Crea
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stud
{
char *name;
int marks[4];
float avg;
}student;
student* Create_Class(int);
void Avg_Mark(student*);
void Print_One(student*);
int main()
{
int size, i;
student *arr;
printf("\nEnter the number of students: ");
scanf("%d", &size);
arr = (student*)malloc(size * sizeof(student));
arr = Create_Class(size);
for (i = 0; i < size; i++)
{
if ((arr + i)->avg > 85)
Print_One(arr + i);
}
for (i = 0; i < size; i++)
free((arr[i].name));
free(arr);
return 0;
}
student* Create_Class(int size)
{
struct stud *Arr;
int i, j, k;
char YourName[51];
int length;
Arr = (struct stud*)malloc(size * sizeof(struct stud));
for (i = 0; i < size; i++)
{
printf("Enter your name: ");
scanf(" %s", YourName);
length = strlen(YourName);
(Arr + i)->name = (char*)malloc(length * sizeof(char));
for (k = 0; k < length; k++)
(Arr + i)->name[k] = YourName[k];
(Arr + i)->name[k] = '\0';
printf("Enter your marks: ");
for (j = 0; j < 4; j++)
scanf("%d", &(Arr + i)->marks[j]);
}
for (i = 0; i < size; i++)
Avg_Mark(Arr + i);
return Arr;
}
void Avg_Mark(student* s)
{
int i;
float sum = 0;
for (i = 0; i < 4; i++)
{
sum += s->marks[i];
}
s->avg = sum / 4;
}
void Print_One(student* s)
{
printf("The average of %s is %.1f\n", s->name, s->avg);
}
#包括
#包括
#包括
类型定义结构螺柱
{
字符*名称;
整数分[4];
浮动平均值;
}学生;
学生*创建_类(int);
无效平均分数(学生*);
无效打印(学生*);
int main()
{
int大小,i;
学生*arr;
printf(“\n输入学生人数:”);
scanf(“%d”,大小(&S);
arr=(学生*)malloc(大小*sizeof(学生));
arr=创建类(大小);
对于(i=0;i平均值>85)
打印一份(arr+i);
}
对于(i=0;iname=(char*)malloc(length*sizeof(char));
对于(k=0;kname[k]=你的名字[k];
(Arr+i)->名称[k]='\0';
printf(“输入您的标记:”);
对于(j=0;j<4;j++)
scanf(“%d”和(Arr+i)->标记[j]);
}
对于(i=0;i标记[i];
}
s->avg=sum/4;
}
作废打印单(学生)
{
printf(“%s的平均值为%.1f\n”,s->name,s->avg);
}
问题似乎在于释放主函数中的名称字段指针。
有人能告诉我出了什么问题吗?
代码本身非常简单,因此如果有任何不清楚的地方,请随时询问,我会尽量详细说明。您的代码中有两个问题
create\u类
arr=(学生*)malloc(大小*sizeof(学生));
arr=创建类(大小)代码>
这将导致内存泄漏,所以只需删除arr=(student*)malloc(size*sizeof(student))代码>
名称字段分配足够的内存
length=strlen(你的名字);
(Arr+i)->name=(char*)malloc(length*sizeof(char))代码>
应该是length=strlen(你的名字)+1
以保持null
char
您可以直接执行
arr=…
,后面紧跟arr=…
(作业的右侧与此无关)。想一想你在那里做了什么。至于你的问题,你似乎记得字符串需要终止,但你从来没有为终止符分配空间。到底是什么让你认为有问题?程序是否没有输出正确的结果?有错误吗?告诉我们,这段代码中有一个错误,它破坏了堆。必须分配长度+1个字符,以确保有足够的空间容纳最后的零。像strpy_s()这样的安全CRT函数可以帮助您发现这样的错误。另一个不相关的注意事项是,对于任何指针p
和索引i
,表达式*(p+i)
完全等于p[i]
。这意味着您可以使用Arr[i].name来代替(Arr+i)->name
。意思完全相同,但写起来更短,更容易阅读,更容易理解。