You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法修改传递给函数的数组,C语言学生数据库程序故障求助

C语言学生数据库程序崩溃问题排查与修复

核心错误分析与修复

1. 字符串数组参数类型不匹配(程序崩溃主因)

你传递的姓名、科目数组都是二维字符数组,但函数参数声明成了一维数组(会被解析为char*),导致地址计算完全错误,触发非法内存访问,直接引发程序崩溃。

修复:
修改函数参数为二维数组的正确声明:

// 修改wygenerowanieStudentow的参数
void wygenerowanieStudentow(int proporcja, Student strukturaStudentow[],
                            char imionaMeskie[][maksymalnaDlugosc], char nazwiskaMeskie[][maksymalnaDlugosc],
                            char imionaZenskie[][maksymalnaDlugosc], char nazwiskaZenskie[][maksymalnaDlugosc])

// 修改printStudentsWithGrades的参数
void printStudentsWithGrades(Student strukturaStudentow[], char przedmioty[][maksymalnaDlugosc])

同时,复制字符串时不需要取地址&,直接用数组索引即可(imionaMeskie[tablicaTymczasowa[i]]本身就是字符串首地址):

strcpy(strukturaStudentow[i].imie, imionaMeskie[tablicaTymczasowa[i]]);

2. 洗牌函数逻辑错误

当前losowanieImionINazwisk只是用随机位置的值覆盖当前位置,会导致数组大量重复索引,且丢失原始数据,无法实现随机不重复效果。正确做法是用Fisher-Yates洗牌算法交换元素:

修复后的洗牌函数:

void losowanieImionINazwisk(int tablicaTymczasowa[]) {
    for (int i = 0; i < liczbaImionINazwisk; i++) {
        tablicaTymczasowa[i] = i;
    }

    int zmiennaLosowaTymczasowa;
    // 从后往前交换,确保每个元素只被随机一次
    for (int i = liczbaImionINazwisk - 1; i > 0; i--) {
        zmiennaLosowaTymczasowa = rand() % (i + 1);
        // 交换当前元素与随机位置元素
        int temp = tablicaTymczasowa[i];
        tablicaTymczasowa[i] = tablicaTymczasowa[zmiennaLosowaTymczasowa];
        tablicaTymczasowa[zmiennaLosowaTymczasowa] = temp;
    }
}

3. 学生生成循环边界错误

第二个循环的终止条件i < (liczbaStudentow - proporcja)完全错误,会导致无法生成足够的学生(比如proporcja=10时,循环直接不执行,只生成10个学生)。正确终止条件应覆盖所有20个学生:

修复后的循环:

// 生成男性学生
for (int i = 0; i < proporcja; i++) {
    strcpy(strukturaStudentow[i].imie, imionaMeskie[tablicaTymczasowa[i]]);
    strcpy(strukturaStudentow[i].nazwisko, nazwiskaMeskie[tablicaTymczasowa[i]]);
    for (int j = 0; j < liczbaPrzedmiotow; j++) {
        strukturaStudentow[i].oceny[j] = (float)(rand() % 5 + 2);
    }
}
// 生成女性学生:从proporcja开始,到20结束
for (int i = proporcja; i < liczbaStudentow; i++) {
    strcpy(strukturaStudentow[i].imie, imionaZenskie[tablicaTymczasowa[i]]);
    strcpy(strukturaStudentow[i].nazwisko, nazwiskaZenskie[tablicaTymczasowa[i]]);
    for (int j = 0; j < liczbaPrzedmiotow; j++) {
        strukturaStudentow[i].oceny[j] = (float)(rand() % 5 + 2);
    }
}

4. 打印函数格式优化(可选)

原打印逻辑没有分隔符和换行,输出混乱,建议修改为:

void printStudentsWithGrades(Student strukturaStudentow[], char przedmioty[][maksymalnaDlugosc]) {
    for (int i = 0; i < liczbaStudentow; i++) {
        printf("Imie i nazwisko: %s %s, Oceny z przedmiotow: ",
               strukturaStudentow[i].imie, strukturaStudentow[i].nazwisko);
        for (int j = 0; j < liczbaPrzedmiotow; j++) {            
            printf("%s %.1f", przedmioty[j], strukturaStudentow[i].oceny[j]);
            if (j != liczbaPrzedmiotow - 1) {
                printf(", ");
            }
        }
        printf("\n"); // 每个学生信息后换行
    }
}

修复后的完整代码

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>

#define liczbaStudentow 20  //stala liczba studentow
#define liczbaPrzedmiotow 5 //stala liczba przedmiotow
#define maksymalnaDlugosc 30
#define liczbaImionINazwisk 50

typedef struct {
    char imie[40];
    char nazwisko[40];
    float oceny[liczbaPrzedmiotow];
} Student;

int losujProporcje() {
    // 可选:生成5-15的男性数量,避免极端比例
    return rand() % 11 + 5;
}

void losowanieImionINazwisk(int tablicaTymczasowa[]) {
    for (int i = 0; i < liczbaImionINazwisk; i++) {
        tablicaTymczasowa[i] = i;
    }

    int zmiennaLosowaTymczasowa;
    for (int i = liczbaImionINazwisk - 1; i > 0; i--) {
        zmiennaLosowaTymczasowa = rand() % (i + 1);
        int temp = tablicaTymczasowa[i];
        tablicaTymczasowa[i] = tablicaTymczasowa[zmiennaLosowaTymczasowa];
        tablicaTymczasowa[zmiennaLosowaTymczasowa] = temp;
    }
}
    
void wygenerowanieStudentow(int proporcja, Student strukturaStudentow[],
                            char imionaMeskie[][maksymalnaDlugosc], char nazwiskaMeskie[][maksymalnaDlugosc],
                            char imionaZenskie[][maksymalnaDlugosc], char nazwiskaZenskie[][maksymalnaDlugosc]) {
    int tablicaTymczasowa[liczbaImionINazwisk];
    losowanieImionINazwisk(tablicaTymczasowa);

    for (int i = 0; i < proporcja; i++) {
        strcpy(strukturaStudentow[i].imie, imionaMeskie[tablicaTymczasowa[i]]);
        strcpy(strukturaStudentow[i].nazwisko, nazwiskaMeskie[tablicaTymczasowa[i]]);
        for (int j = 0; j < liczbaPrzedmiotow; j++) {
            strukturaStudentow[i].oceny[j] = (float)(rand() % 5 + 2);
        }
    }
    for (int i = proporcja; i < liczbaStudentow; i++) {
        strcpy(strukturaStudentow[i].imie, imionaZenskie[tablicaTymczasowa[i]]);
        strcpy(strukturaStudentow[i].nazwisko, nazwiskaZenskie[tablicaTymczasowa[i]]);
        for (int j = 0; j < liczbaPrzedmiotow; j++) {
            strukturaStudentow[i].oceny[j] = (float)(rand() % 5 + 2);
        }
    }
}

void printStudentsWithGrades(Student strukturaStudentow[], char przedmioty[][maksymalnaDlugosc]) {
    for (int i = 0; i < liczbaStudentow; i++) {
        printf("Imie i nazwisko: %s %s, Oceny z przedmiotow: ",
               strukturaStudentow[i].imie, strukturaStudentow[i].nazwisko);
        for (int j = 0; j < liczbaPrzedmiotow; j++) {            
            printf("%s %.1f", przedmioty[j], strukturaStudentow[i].oceny[j]);
            if (j != liczbaPrzedmiotow - 1) {
                printf(", ");
            }
        }
        printf("\n");
    }
}

int main() {
    srand(time(NULL));

    char imionaMeskie[50][maksymalnaDlugosc] = {
        "Adam", "Aleksander", "Andrzej", "Antoni", "Bartłomiej",
        "Bogdan", "Cezary", "Damian", "Dariusz", "Dawid", "Edward",
        "Fabian", "Feliks", "Filip", "Franciszek", "Grzegorz",
        "Henryk", "Igor", "Jacek", "Jan", "Józef", "Kamil", "Karol",
        "Lech", "Lesław", "Marek", "Mariusz", "Mateusz", "Michał",
        "Piotr", "Rafał", "Robert", "Sebastian", "Sławomir",
        "Stanisław", "Tomasz", "Wojciech", "Zbigniew", "Zdzisław",
        "Adrian", "Arkadiusz", "Bartosz", "Damian", "Daniel",
        "Dariusz", "Dominik", "Fabian", "Grzegorz", "Jakub",
        "Kamil"
    };
    char nazwiskaMeskie[50][maksymalnaDlugosc] = {
        "Kowalski", "Mazur", "Kowalczyk", "Wojciechowski",
        "Kamiński", "Kowalewski", "Zieliński", "Szymański",
        "Woźniak", "Dąbrowski", "Kozłowski", "Jankowski",
        "Wojciechowski", "Kwiatkowski", "Kaczmarek", "Malinowski",
        "Piotrowski", "Grabowski", "Nowakowski", "Pawłowski",
        "Michalski", "Adamczyk", "Dudek", "Zając", "Wieczorek",
        "Jabłoński", "Król", "Majewski", "Olszewski", "Jaworski",
        "Wróbel", "Makowski", "Kaczmarczyk", "Domański", "Zalewski",
        "Jakubowski", "Jasiński", "Zawadzki", "Sadowski", "Bąk",
        "Chmielewski", "Włodarczyk", "Borkowski", "Czarnecki",
        "Sawicki", "Sokolowski", "Urbanski", "Kubiak", "Maciejewski",
        "Szewczyk"
    };
    char imionaZenskie[50][maksymalnaDlugosc] = {
        "Anna", "Maria", "Katarzyna", "Agnieszka", "Ewa",
        "Małgorzata", "Joanna", "Krystyna", "Barbara", "Elżbieta",
        "Danuta", "Halina", "Helena", "Irena", "Jadwiga", "Janina",
        "Kazimiera", "Magdalena", "Teresa", "Zofia", "Dorota",
        "Aleksandra", "Bożena", "Cecylia", "Ewelina", "Gabriela",
        "Iwona", "Julia", "Karolina", "Lidia", "Liliana", "Lucyna",
        "Marianna", "Monika", "Renata", "Sandra", "Stanisława",
        "Urszula", "Weronika", "Zuzanna", "Beata", "Jolanta",
        "Stanisława", "Alicja", "Amelia", "Kamila", "Kinga", "Maja",
        "Natalia", "Paulina"
    };
    char nazwiskaZenskie[50][maksymalnaDlugosc] = {
        "Nowak", "Kowalska", "Wiśniewska", "Wójcik", "Kowalczyk",
        "Kamińska", "Lewandowska", "Dąbrowska", "Zielińska",
        "Szymańska", "Woźniak", "Kozłowska", "Jankowska", "Mazur",
        "Wojciechowska", "Kwiatkowska", "Krawczyk", "Kaczmarek",
        "Piotrowska", "Grabowska", "Zając", "Pawłowska", "Nowacka",
        "Adamczyk", "Tyszkiewicz", "Stępień", "Olszewska", 
        "Jabłońska", "Chmielewska", "Włodarczyk", "Borkowska",
        "Czarnecka", "Sobczak", "Krupa", "Maciejewska", "Sikora",
        "Mróz", "Dudek", "Kot", "Stasiak", "Baran", "Rutkowska",
        "Michalska", "Sawicka", "Sadowska", "Wróblewska", "Walczak",
        "Sosnowska", "Kacprzak", "Kempowinska"
    };
    char przedmioty[5][maksymalnaDlugosc] = {
        "Matematyka 1:", "Matematyka 2:", "J. angielski:", 
        "Informatyka:", "Etyka Zawodowa:"
    };
    
    Student strukturaStudentow[20];
    
    int proporcja = losujProporcje();

    wygenerowanieStudentow(proporcja, strukturaStudentow, imionaMeskie, 
                           nazwiskaMeskie, imionaZenskie, nazwiskaZenskie);
    
    printStudentsWithGrades(strukturaStudentow, przedmioty);
    
    return 0;
}

内容的提问来源于stack exchange,提问作者NaviteLogger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:11:29