我在制作结构数组时遇到问题。我想存储有关多个学生的数据并通过程序的执行获取输入。然后输出得分最高的人名的内存地址。
我尝试在网站上了解类似问题的答案,但没有帮助。
我写的代码是
结构体
struct student{
char name;
int marks;
};
函数是
int num,max = 0,i;
printf("Number of students?\n");
scanf("%d", &num);
struct student* students = (struct student*)malloc (num* (sizeof(struct student)));
for (int x = 0; x < num; x++)
{
printf("Enter Name\n");
scanf("%c" , &students[x].name);
printf("Enter Marks\n");
scanf ("%d" , &students[x].marks);
}
for (i = 1; i < num; i++)
{
if (students[max].marks<students[i].marks)
{
max = i;
}
}
printf("The Memory Add for %c is %p\n", students[max].name , &students[max].name );
它是菜单驱动程序的一部分。在函数代码的第 5 行之后,它进入了一个奇怪的循环。我无法为其创建双向链表。
编辑 1
这些是我对 struct 和 func 所做的更改
struct student{
char name[20];
int marks;
};
void memadd(){
int num,max = 0,i, mark;
printf("Number of students?\n");
scanf("%d", &num);
struct student* students = (struct student*)malloc (num* (sizeof(struct student)));
for (int x = 0; x < num; x++)
{
printf("Enter Name\n");
scanf("%s" , &students[x].name);
printf("Enter Marks\n");
scanf ("%d" , &mark);
students[x].marks = mark;
}
for (i = 1; i < num; i++)
{
if (students[max].marks<students[i].marks)
{
max = i;
}
}
printf("The Memory Add for %s is %p\n", students[max].name , &students[max].name );
它在名称输入处给出一个数组。 “格式指定类型‘char ’,但参数有 类型 'char ()[20]'"
如何将格式设为char * [20]?
编辑2 将字符名称更正为字符数组后的最终工作代码 以及姓名扫描问题。
struct student{
char name[20];
int marks;
};
int num,max = 0,i, mark;
printf("Number of students?\n");
scanf("%d", &num);
struct student* students = (struct student*)malloc (num* (sizeof(struct student)));
for (int x = 0; x < num; x++)
{
printf("Enter Name\n");
scanf("%19s" , students[x].name);
printf("Enter Marks\n");
scanf ("%d" , &mark);
students[x].marks = mark;
}
for (i = 1; i < num; i++)
{
if (students[max].marks<students[i].marks)
{
max = i;
}
}
printf("The Memory Add for %s is %p\n", students[max].name , &students[max].name );
但是,如果我想以十六进制数字打印地址怎么办?或者得到的已经是十六进制了。? 因为我得到的输出是The Memory Add for XYZ is 0x7fb340c03928
最佳答案
问题在于学生姓名是一个字符并且
scanf("%c" , &students[x].name);
发生的情况是,您读到的学生人数为
scanf("%d", &num);
现在您已读取num
,但输入缓冲区中仍有换行符。
然后您尝试使用 %c
读取字符,但这会读取剩余的换行符。
当您将学生的姓名更改为字符数组时,例如
struct student{
char name[20];
int marks;
};
并使用
读取名称scanf("%19s" , students[x].name);
它将跳过剩余的空格/换行符并按应有的方式读取名称。
关于c - C 中的结构体数组,非链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23767311/