此代码接受struct Student数组,然后使用指针显示它。 代码使用不常见的方法。常用方法在此代码本身的单行注释中显示。
然而,这种方法似乎存在一些问题,因为"百分比"没有显示。谁能告诉我这个问题的原因是什么?
#include<stdio.h>
struct Student
{
char grade;
int rollNumber;
float percentage;
};
typedef struct Student Student;
void acceptArray(Student*);
void displayArray(Student*);
int main()
{
Student myFriends[3];
Student* p = myFriends;
acceptArray(p);
displayArray(p);
}
void acceptArray(Student* p)
{
int i = 0;
for(i = 0; i < 3; i++)
{
printf("\nEnter grade, roll number, and percentage:\n");
scanf(" %c %d %f",
(p + i),
//&(p + i)->grade
//&p[i].grade
( (Student*)((unsigned int)p + sizeof(char)) + i ),
//&(p + i)->rollNumber
//&p[i].rollNumber
( (Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i )
//&(p + i)->percentage
//&p[i].percentage
);
}
}
void displayArray(Student* p)
{
int i = 0;
for(i = 0; i < 3; i++)
{
printf("\nGrade is : %c.", *(p + i));
//(p + i)->grade
//p[i].grade
printf("\nRoll number is: %d.", *( (Student*)((unsigned int)p + sizeof(char)) + i ));
//(p + i)->rollNumber
//p[i].rollNumber
printf("\nPercentage is : %.1f.", *( (Student*)((unsigned int)p + sizeof(char) + sizeof(int)) + i ));
//(p + i)->percentage
//p[i].percentage
}
}
答案 0 :(得分:0)
您没有正确使用指针。最好的方法是通过[i]对其进行索引,并通过.
运算符访问struct成员。
通过这种方式,您将获得更清晰的代码。由于填充孔,建议不要按照您的方式进入结构内部。
#include<stdio.h>
struct Student
{
char grade;
int rollNumber;
float percentage;
};
typedef struct Student Student;
void acceptArray(Student*);
void displayArray(Student*);
int main()
{
Student myFriends[3];
Student* p = myFriends;
acceptArray(p);
displayArray(p);
}
void acceptArray(Student* p)
{
int i = 0;
char c;
int d;
float f;
for(i = 0; i < 3; i++)
{
printf("\nEnter grade, roll number, and percentage:\n");
scanf(" %c %d %f", &c, &d, &f);
p[i].grade = c;
p[i].rollNumber = d;
p[i].percentage = f;
}
}
void displayArray(Student* p)
{
int i = 0;
for(i = 0; i < 3; i++)
{
printf("\nGrade is : %c.", p[i].grade );
printf("\nRoll number is: %d.", p[i].rollNumber );
printf("\nPercentage is : %.1f.", p[i].percentage );
}
}
输出:
Enter grade, roll number, and percentage:
A 1 66.8
Enter grade, roll number, and percentage:
B 2 77.8
Enter grade, roll number, and percentage:
C 3 88.9
Grade is : A.
Roll number is: 1.
Percentage is : 66.8.
Grade is : B.
Roll number is: 2.
Percentage is : 77.8.
Grade is : C.
Roll number is: 3.
Percentage is : 88.9.
答案 1 :(得分:0)
您正尝试将struct对象的单个组件地址传递给scanf
。你这样做的方式是错误的。这是不对的,因为(摘自C A参考手册)。
任何两个连续组件之间可能出现孔或填充 在结构布局中的最后一个组件之后如果必要的话 允许在内存中正确对齐组件。位模式 出现在这样的洞中是不可预测的,可能会有所不同 结构在一个结构内的结构或随着时间的推移。
据说它通常更清晰,更易读,更容易在结构中阅读(&p[i].grade
..)。简单易懂。