[英]Accessing struct array elements
該程序應該捕獲用戶輸入到結構中的輸入,然后打印出給定信息的直方圖。 到目前為止一切正常,除了當我嘗試打印直方圖時,無論學生的成績如何,所有'*'字符都屬於F級。 我認為正在發生的是學生的數組索引被傳遞而不是實際變量本身,但我很困惑,因為在直方圖打印之前的輸出中它顯示正確的值。 有什么建議?
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 28
#define MAXGRADE 100
struct studentData{
char studentID[MAXSIZE];
char studentName[MAXSIZE];
int examPercent;
} studentRecords[MAXSIZE];
// function prototype for histogram
void displayHist(struct studentData *records, int classSize);
int main()
{
int i, students = -1;
//struct studentData *studentRecords[MAXSIZE];
while(students < 0 || students > MAXSIZE)
{
printf("Please enter the number of students in your class:\n");
scanf("%d", &students);
if(students > MAXSIZE || students <= 0)
{
printf("Try again..\n");
scanf("%d", &students);
}
}
for(i=0;i<students;i++) {
printf("Please enter the student #%d's lastname:\n", i+1);
scanf("%s", &studentRecords[i].studentID);
printf("Please enter the student #%d's ID#:\n", i+1);
scanf("%s", &studentRecords[i].studentName);
printf("Please enter the student's exam percent:\n");
scanf("%d", &studentRecords[i].examPercent);
}
//This is just here to view the input...
for(i=0;i<students;i++) {
printf("Student #%d's name is %s\n", i+1, studentRecords[i].studentName);
printf("student #%d's ID#:%s\n", i+1, studentRecords[i].studentID);
printf("student #%d's grade was %d\n", i+1, studentRecords[i].examPercent);
}
displayHist(&studentRecords[students], students);
return 0;
}
void displayHist(struct studentData *records, int classSize)
{
int i;
printf("A:");
for(i=0;i<classSize;i++)
{
if(records[i].examPercent >=90)
{
printf("*");
}
}
printf("\n");
printf("B:");
for(i=0;i<classSize;i++)
{
if(records[i].examPercent< 90 && records[i].examPercent >= 80)
{
printf("*");
}
}
printf("\n");
printf("C:");
for(i=0;i<classSize;i++)
{
if(records[i].examPercent < 80 && records[i].examPercent >= 70)
{
printf("*");
}
}
printf("\n");
printf("D:");
for(i=0;i<classSize;i++)
{
if(records[i].examPercent< 70 && records[i].examPercent >= 60)
{
printf("*");
}
}
printf("\n");
printf("F:");
for(i=0;i<classSize;i++)
{
if(records[i].examPercent < 60)
{
printf("*");
}
}
}
displayHist(&studentRecords[students], students);
&studentRecords[students]
是陣列后的地址studentRecords
。 在displayHists
,對records[i]
訪問將嘗試取消引用studentRecords[students+i]
,這超出了數組的范圍。
正確的電話可能是:
displayHist(&studentRecords[0], students);
這相當於:
displayHist(studentRecords, students);
順便說一句,沒有必要使用&
在scanf
與char *
,因為char (*)[]
和char *
可能有不同的內存中表示。
scanf("%s", &studentRecords[i].studentID);
scanf("%s", &studentRecords[i].studentName);
warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[28]’ [-Wformat]
當你使用address-of,即&
,它變成char **
,這不是scanf
期望的。
所以嘗試使用這種方式。
scanf("%s", &(*studentRecords[i].studentID));
和
displayHist(studentRecords, students);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.