【问题标题】:How do you copy a Struct array to another struct in the same array?如何将 Struct 数组复制到同一数组中的另一个结构?
【发布时间】:2014-11-26 02:36:18
【问题描述】:

我正在尝试处理我的代码,但由于尝试将特定数组位置的结构复制到不同位置的同一数组中的另一个结构而导致崩溃,我无法使用排序算法。

//include statements
#include <stdio.h>
#include <stdlib.h>

//defines
#define MAX 100
#define STRUCTMAX 26
#define STUDENTS 9

//Struct declarations
typedef struct{
    char street[STRUCTMAX];
    char city[STRUCTMAX];
    char state[STRUCTMAX];
    char zip[STRUCTMAX];
}Address;

typedef struct{
    char firstName[STRUCTMAX];
    char initial[STRUCTMAX];
    char lastName[STRUCTMAX];
    Address adress;
    int age;
    double gpa;
}Student;

//prototypes
void readFile(Student students[]);
void printAll(Student students[]);
void printBestGpaName(Student students[]);
double averageGPA(Student students[]);
void printAboveAverageGPA(Student students[]);
void printYoungestLowGPA(Student students[]);
void sortStruct(Student students[]);
void strSub(char s1 [], char s2 [], int start, int size);
void initialize(Student students[]);

void main(void){
    Student students[STUDENTS];
    readFile(students);
    printAll(students);
    printBestGpaName(students);
    printf("Average G.P.A is %.2lf\n" ,averageGPA(students));
    printAboveAverageGPA(students);
    printYoungestLowGPA(students);
    sortStruct(students);
    printf("\n");
    printAll(students);
}

void readFile(Student students[]){
int i = 0;
char numberValue[10];
char line[MAX];
FILE *fp;

fp = fopen(
           "/Users/derekroy/Desktop/Lab_6/Lab_6A/Students.dat", "r");
if (fp == NULL) {
    printf("Students.dat file not found.\n");
    exit(1);
}

while (!feof(fp)) {
    fgets(line, MAX, fp);

    strSub(line, students[i].firstName, 0, 7);
    strSub(line, students[i].initial, 10, 1);
    strSub(line, students[i].lastName, 11, 9);
    strSub(line, students[i].adress.street, 20, 16);
    strSub(line, students[i].adress.city, 36, 13);
    strSub(line, students[i].adress.state, 49, 2);
    strSub(line, students[i].adress.zip, 52, 5);

    strSub(line, numberValue, 58, 2);
    students[i].age = atoi(numberValue);

    strSub(line, numberValue, 60, 5);
    students[i].gpa = atof(numberValue);

    i++;
    }
}

void printAll(Student students[]){
int i;

printf("All listed Students: \n");

for(i = 0; i < STUDENTS; ++i){
    printf("%s %s %s %s %s %s, %s %d %.2lf\n" , students[i].firstName, students[i].initial,
           students[i].lastName, students[i].adress.street, students[i].adress.city,
           students[i].adress.state, students[i].adress.zip, students[i].age, students[i].gpa);
}
printf("\n");
printf("******");
}


void printBestGpaName(Student students[]){
int i, best = 0;

for(i = 0; i < STUDENTS; ++i){
    if(students[i].gpa > students[best].gpa)
        best = i;
}

printf("Student with best G.P.A: ");
printf("%s %s %s\n" , students[best].firstName, students[best].initial, students[best].lastName);
}

double averageGPA(Student students[]){
int i;
double sum = 0.0;

for(i = 0; i < STUDENTS; ++i){
    sum += students[i].gpa;
}

return sum / i;
}

void printAboveAverageGPA(Student students[]){
int i;
double average = averageGPA(students);

printf("Students with above average G.P.A: \n");

for(i = 0; i < STUDENTS; ++i){
    if(students[i].gpa > average)
        printf("%s %s %s\n" , students[i].firstName, students[i].initial, students[i].lastName);
    }
}

void printYoungestLowGPA(Student students[]){
int i, j, young = 1000;
double average = averageGPA(students);

for(i = 0; i < STUDENTS; ++i){
    if(students[i].gpa < average){
        if(students[i].age < young){
            j = i;
            young = students[i].age;
        }
    }
}

printf("The youngest student with a below average G.P.A: ");
printf("%s %s %s\n" ,students[j].firstName, students[j].initial, students[j].lastName);
}

void sortStruct(Student students[]){
int i, j;
Student temp;

for(i = 1; i < STRUCTMAX; ++i){
    /*temp.firstName = students[i].firstName;
    temp.initial = students[i].initial;
    temp.lastName = students[i].lastName;
    temp.adress.street = students[i].adress.street;
    temp.adress.city = students[i].adress.city;
    temp.adress.state = students[i].adress.state;
    temp.adress.zip = students[i].adress.zip;
    temp.age = students[i].age;
    temp.gpa = students[i].gpa;*/

    temp = students[i];
    j = i - 1;

    while(j >= 0 && temp.gpa < students[j].gpa){
        //students[j+1] = students[j];
        j = j - 1;
    }
    //students[j+1] = temp;

    }
}

void strSub(char s1 [], char s2 [], int start, int size){
int i;

for(i = 0; i < size; ++i){
        s2[i] = s1[start];
        start++;
    }
s2[i] = '\0';
}

有问题的行在排序函数中。 我怎样才能做到这一点,并将指定的结构复制到结构数组中的新地址?

【问题讨论】:

  • students[j+1] = students[j]; 是复制结构的正确方法。崩溃表明您正在访问超出数组范围;因此,您将需要查看程序的其余部分。 (根据您迄今为止发布的代码,这里的任何人都无法检查,因为您没有包括函数的调用方式或任何内容)。
  • @MattMcNabb 嘿,感谢您的评论。我添加了我正在使用的程序的其余部分。
  • while (!feof(fp)) { fgets(line, MAX, fp); 是错误的。使用while (fgets(line, MAX, fp) != NULL) {。更好:while (i &lt; STUDENTS &amp;&amp; fgets(line, sizeof line, fp) != NULL) {
  • 注意:由于double 的精度有限,您可能希望在进行平均时使用轻微的偏移量:if(students[i].gpa &gt; average*1.0000001)
  • void main 不对

标签: c arrays sorting struct


【解决方案1】:

您只定义了 9 个学生记录

Student students[STUDENTS];   -> STUDENTS macro is 9

您正在迭代直到 STRUCTMAX 这是一个定义为 26 的宏 所以你会越界导致崩溃

for(i = 1; i < STRUCTMAX; ++i){

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2022-11-30
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多