scanf不会采取&(*(p + i).grade)

时间:2017-12-09 23:09:03

标签: c

void storing(struct student * p, int count)
{
    int i,j;

    for ( i = 0; i < count; i++)
    {
        printf("the %d student's info\n", i+1);

        printf("name:\n");
        scanf("%s", p[i].name); 
        printf("age:\n");
        scanf("%d", &((&p[i])->age));  
        printf("grade:\n");
        scanf("%d", &(*(p+i).grade));        
    }
    return;
}

我不知道为什么scanf没有&(*(p+i).grade)?我知道*(p+i) ≡ p[i],但我不知道为什么它在这里不起作用。我在我编写的另一个代码中使用*(p+i)做了类似的事情:*p.age = 10;并且它成功地将值写入成员age

2 个答案:

答案 0 :(得分:0)

您正确执行了从a[b]*(a+b)的转换,但您错过了点.运算符与解除引用*运算符的优先级。

您需要强制评估运算符的方式,如下所示:

scanf("%d", &((*(p+i)).grade)); // Add parentheses and keep dot . operator

或使用->运算符,如下所示:

scanf("%d", &(p+i)->grade); // Replace dot . with -> operator

请注意->运算符的使用如何减少括号数。

答案 1 :(得分:0)

首先allocate count学生的记忆然后scan数据。

这是我的解决方案:

void storing(struct student *p, int count)
{
        int i,j;
        p = malloc(count * sizeof(struct student));
        for ( i = 0; i < count; i++)
        {
                printf("the %d student's info\n", i+1);

                printf("name:\n");
                scanf("%s", (p+i)->name);
                printf("age:\n");
                scanf("%d", &(p+i)->age);
                printf("grade:\n");
                scanf("%d", &(p+i)->grade);
        }
        return;
}