c - C 中的结构体数组,非链表

标签 c arrays structure

我在制作结构数组时遇到问题。我想存储有关多个学生的数据并通过程序的执行获取输入。然后输出得分最高的人名的内存地址。

我尝试在网站上了解类似问题的答案,但没有帮助。

我写的代码是

结构体

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/

相关文章:

C++ 复制指针

c - 掷7位数以上的骰子

c - gdb "watch"无法通过 glibc(read) 函数修改变量?

java - 如何在 Java 数组中存储 1 亿个整数?

java - 递归确定是否存在与给定 int 参数匹配的正 int 数组的子集和?

c++ - 在 C++ 代码中初始化 C 结构

c++ - 如何在此循环中获得始终如一的高吞吐量?

c - 为什么这个结构不编译?

c++ - 分配给动态数组时,是否会在 C++ 中分配内存?

c - 通过动态分配的结构变量获取用户输入的字符串