簡體   English   中英

在結構中的Sturts數組中初始化字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM