无法修改传递给函数的数组,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
相关产品推荐
相关产品推荐

