【发布时间】:2019-07-30 05:36:16
【问题描述】:
我正在编写一个程序来读取学生成绩,无论是char 还是int,并将其存储在union 中,然后它会打印成绩为A 或>90 的学生。
但是当我尝试这样做时,我得到了一个意外的输出,因为程序不知道我想比较哪一个(char 或 int)。
#include <stdio.h>
#include <stdlib.h>
union StuGrade {
char charGrade;
int intGrade;
};
struct Student {
int ID;
int typeOfGrade;
union StuGrade grade;
};
int main () {
const int size = 5;
struct Student *sList[size];
for (int i = 0; i < size; i++) {
sList[i] = (struct Student *)calloc(1, sizeof(struct Student));
if (!sList[i]) {
puts("Error allocating memory");
return 1;
}
printf("Enter ID: ");
scanf("%d", &(sList[i]->ID));
printf("0 for char grade or 1 for int grade: ");
scanf("%d", &(sList[i]->typeOfGrade));
if (sList[i]->typeOfGrade) {
printf("Enter an int grade: ");
scanf("%d", &(sList[i]->grade.intGrade));
} else {
printf("Enter a char grade: ");
scanf(" %c", &(sList[i]->grade.charGrade));
}
} //end for loop
printf("\n***Student(s) who take grade 'A' is/are***\n");
for (int i = 0; i < size; i++) {
if (sList[i]->grade.charGrade == 'A')
printf("ID: %d \nGrade: %c \n", sList[i]->ID, sList[i]->grade.charGrade);
else if (sList[i]->grade.intGrade >= 90)
printf("ID: %d \nGrade: %d \n", sList[i]->ID, sList[i]->grade.intGrade);
}
for (int i = 0; i < size; i++)
free(sList[i]);
return 0;
}
这是输出:
Enter ID: 1
0 for char grade or 1 for int grade: 0
Enter a char grade: A
Enter ID: 2
0 for char grade or 1 for int grade: 0
Enter a char grade: b
Enter ID: 3
0 for char grade or 1 for int grade: 1
Enter an int grade: 99
Enter ID: 4
0 for char grade or 1 for int grade: 1
Enter an int grade: 84
Enter ID: 5
0 for char grade or 1 for int grade: 1
Enter an int grade: 65
***Student(s) who take grade 'A' is/are***
ID: 1
Grade: A
ID: 2
Grade: 98
ID: 3
Grade: 99
ID: 5
Grade: A
【问题讨论】:
-
您的预期结果是什么?可以发一下吗?
-
同时使用 C 和 C++ 语言标签时要小心,因为它们是非常不同的语言。特别是在联合方面,语言之间存在语义差异。所以请编辑你的问题,只包含你真正编程的语言的语言标签。
-
至于你的问题,你已经把
typeOfGrade保存在了结构体中,那你打印成绩的时候为什么不用那个呢? -
@Chipster 我认为预期的结果是输出与输入相同。所以学生 1 的成绩为“A”,学生 3 的成绩为“99”,其他人则不显示。
-
感谢@Ville-Valteri。我现在明白了。