[英]Initializing Strings in an Array of Sturts within a Struct
我有一本struct成績簿,其中有(其中包括)一個帶有兩個字符串字段的學生結構數組
#define MAX_NAME_LEN 50
#define MAX_EMAIL_LEN 80
#define MAX_NUMBER_OF_STUDENTS 200
#define MAX_NUMBER_OF_ASSIGNMENTS 100
typedef struct students {
char *name;
char *email;
} Students;
typedef struct gradebook {
int number_of_students;
Students students[MAX_NUMBER_OF_STUDENTS];
int number_of_assignments;
char assignments[MAX_NUMBER_OF_ASSIGNMENTS][(MAX_NAME_LEN + 1)];
int scores[MAX_NUMBER_OF_STUDENTS][MAX_NUMBER_OF_ASSIGNMENTS];
} Gradebook;
我有一個初始化功能
int init_gradebook(Gradebook *book) {
int row, col, ndx, count;
book->number_of_students = 0;
count += book->number_of_students;
for(ndx = 0; ndx < MAX_NUMBER_OF_STUDENTS; ndx++) {
book->students[ndx].name = 0;
book->students[ndx].email = 0;
}
book->number_of_assignments = 0;
count += book->number_of_assignments;
for(row = 0; row < MAX_NUMBER_OF_ASSIGNMENTS; row++) {
for(col = 0; col < (MAX_NAME_LEN + 1); col++) {
book->assignments[row][col] = 0;
count += book->assignments[row][col];
}
}
for(row = 0; row < MAX_NUMBER_OF_STUDENTS; row++) {
for(col = 0; col < MAX_NUMBER_OF_ASSIGNMENTS; col++) {
book->scores[row][col] = 0;
count += book->scores[row][col];
}
}
if (count == 0) {
return 1;
} else {
return 0;
}
}
然后我需要使用add_student函數將傳入的字符串插入這兩個字符串字段中。
int add_student(Gradebook *book, char *nom, char *mail) {
int ndx, count;
if (book->number_of_students == 0) {
book->students[(book->number_of_students)].name = malloc(sizeof(51));
book->students[(book->number_of_students)].email = malloc(sizeof(81));
strcpy(book->students[(book->number_of_students)].name, nom);
strcpy(book->students[(book->number_of_students)].email, mail);
book->number_of_students++;
} else {
for (ndx = 0; ndx < book->number_of_students; ndx++) {
book->students[(book->number_of_students)].name = malloc(sizeof(51));
book->students[(book->number_of_students)].email = malloc(sizeof(81));
strcpy(book->students[(book->number_of_students)].name, nom);
strcpy(book->students[(book->number_of_students)].email, mail);
book->number_of_students++;
}
}
return 1;
}
我的代碼可以編譯,但是當我使用main函數運行它時,會出現段錯誤。 我最終將嘗試執行add_student函數(將給定的字符串復制到book-> student [ndx] .name中)。如果需要查看主文件或gradebook.h文件,請告訴我。
編輯:謝謝大家,這個問題已經解決。 如abginfo所指出的,主要問題是我的If Else +其中的For循環。 但是現在我的程序中還有其他問題。 哈哈謝謝你。
從代碼的哪一部分看,我將假設init_gradebook函數采用未分配的對成績簿的引用並嘗試對其進行初始化。 在這種情況下,您尚未為成績簿參考分配任何內存。 在嘗試初始化其其余變量之前,請嘗試使用malloc()函數將所需的內存分配給您的成績簿引用。
gb = (Gradebook*)malloc(sizeof(*Gradebook));
我已經更改了變量名以避免任何混淆。
為了補充varevarao的答案,您應該習慣性地明確分配所有內容,而不要依靠段錯誤來告訴您未分配的內容。 (並非您一定要這樣做!)處理未分配的內存是未定義的行為,因此在某些情況下,此代碼不會觸發錯誤-
int main (void) {
Gradebook mybook;
init_gradebook(&mybook);
printf("there are %i students\n", mybook.number_of_students);
add_student(&mybook, "blerf", "blerf@gmail.com");
printf("now there are %i students\n", mybook.number_of_students);
printf("%s has an email address of %s\n", mybook.students[0].name, mybook.students[0].email);
return 0;
}
返回(在我的機器上)
there are 0 students
now there are 1 students
blerf has an email address of blerf@gmail.com
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.