簡體   English   中英

訪問struct數組元素

[英]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);

順便說一句,沒有必要使用&scanfchar * ,因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM