Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing struct array elements

Tags:

arrays

c

struct

This program is supposed to capture input from the user into the struct and then print out a histogram of the given information. Everything works fine so far except that when I try to print the histogram all the '*' characters fall under the F grade no matter what the student's grade. What I think is happening is that the student's array index is being passed instead of the actual variable itself, but I'm confused because in the output before the histogram is printed it shows the correct value. Any suggestions?

#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("*");
        }

    }
}
like image 648
KryptNick Avatar asked Nov 03 '22 23:11

KryptNick


1 Answers

displayHist(&studentRecords[students], students);

&studentRecords[students] is an address after your array studentRecords. In displayHists, accesses to records[i] will try to dereference studentRecords[students+i], which is outside the bounds of your array.

A correct call could be:

displayHist(&studentRecords[0], students);

Which is equivalent to:

displayHist(studentRecords, students);

By the way, no need to use & in scanf with char *, because char (*)[] and char * may have different memory representations.

like image 109
md5 Avatar answered Nov 11 '22 08:11

md5