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
。
答案 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;
}