【问题标题】:Array of Structures in C. not linked listC中的结构数组。非链表
【发布时间】:2014-05-20 18:28:47
【问题描述】:

我在制作结构数组时遇到了麻烦。我想存储有关多个学生的数据并使用程序的执行来获取输入。然后输出最高分的人名的内存地址。

我试图在现场了解类似问题的答案,但没有任何帮助。

我写的代码是

结构

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

的输出

【问题讨论】:

  • 你的结构中的第一个条目是char name吗?那当然应该是一个字符数组,例如char name[80],然后应该使用 %s 进行扫描,或者更好的是 %79s
  • 必须删除&amp;,因为数组name已经指向第一个元素的地址。
  • 是的,谢谢。这是代码中唯一剩下的错误。

标签: c arrays structure


【解决方案1】:

问题在于学生姓名是 char 并且

scanf("%c" , &students[x].name);

发生的情况是,你读到有

的学生人数
scanf("%d", &num);

现在您已经阅读了num,但输入缓冲区中仍有换行符。 然后您尝试使用%c 读取一个字符,但这会读取剩余的换行符。

当您将学生的姓名更改为字符数组时,例如

struct student{
    char name[20];
    int marks;
};

并用

读取名称
scanf("%19s" , students[x].name);

它将跳过剩余的空格/换行符并按应有的方式读取名称。

【讨论】:

    猜你喜欢
    • 2017-08-31
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多