将字符串存储到 C 中的链表

Storing strings to Linked list in C

在我的问题中,我需要从 txt 文件中读取行。
每行包含student_id、姓名、生日、性别、部门和年级(class)。
例如 ( 155898933;Nuh Kaplan;26/01/1998;M;ME;2 )
然后我需要将它们存储在链表中。
我声明我的结构如下:

struct Node{
    int id;
    char name[100];
    int date; //YYYYMMDD (String date will be converted to integer. I created dateStrInt function for this conversion.)
    char gender[2];
    char departmentCode[6];
    int classGrade;
    struct Node *next;
};

然后我用这部分代码读取行并存储在一个字符数组中:

if (fptr != NULL) {
    while (fgets (buff, 100, fptr)) {
        char* split = strtok(buff, ";");
        while( split != NULL ) {
            strcpy(arr[i][j], split); 
            j++;
            split = strtok(NULL, ";");
        }
        i++;
        j = 0;
    } 
}

将行存储到字符数组后,我需要将它们存储到链表中。我尝试按如下方式进行:

for(int i = 0; i < len; i++) {
    p = (struct Node*) malloc(sizeof(struct Node));
    j = 0;
    p->id = (int)arr[i][j];
    strcpy(p->name, arr[i][j+1]);
    p->date = dateStrInt(arr[i][j+2]);
    strcpy(p->gender,arr[i][j+3]);
    strcpy(p->departmentCode, arr[i][j+4]);
    p->classGrade = (int)arr[i][j+5];
      
    j = 0;

    if(list == NULL){
        list = p;
        p -> next = NULL;
        last = p;
    }
    else {
        last -> next = p;
        p -> next = NULL;
        last = p;
    }
}

然而,当我 运行 我的代码时,我得到学生 ID 和 class 成绩的垃圾值。 你能帮我解决这个问题吗?

我的孔码:

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

struct Node {
    int id;
    char name[100];
    int date; //YYYYMMDD
    char gender[2];
    char departmentCode[6];
    int classGrade;
    struct Node *next;
};

int dateStrInt(char str[]) {
    int d, m, y;
    sscanf(str, "%d/%d/%d", &d, &m, &y);
    return (y * 10000 + m * 100 + d);
} 

int countLines(char* filename) {
    int count = 0;
    FILE *fptr;
    fptr = fopen(filename, "r");
    if(fptr == NULL){
        printf("File does not exist.");
        exit(1);
    }
    else {
        for(char ch = getc(fptr); ch != EOF; ch = getc(fptr)) {
            if(ch == '\n'){
                count++;
            }
        }
    }
    return count + 1;
 }

 struct Node* createList(struct Node* list, int len, char filename[]){
     struct Node* last;
     struct Node* p;
     char buff[100];
     char arr[len][6][100];
     int i = 0, j = 0;
     FILE* fptr = fopen(filename,"r");


     if (fptr != NULL) {
         while (fgets (buff, 100, fptr)) {
             char* split = strtok(buff, ";");
             while( split != NULL ) {
                 strcpy(arr[i][j], split); 
                 j++;
                 split = strtok(NULL, ";");
             }
             i++;
             j = 0;
         } 
     }



     int o = 0;
     for(int k = 0; k < len; k++){
         printf("\nID = %s", arr[k][o]);
         printf("\nName = %s", arr[k][o+1]);
         printf("\nBirth Date = %s", arr[k][o+2]);
         printf("\nGender = %s", arr[k][o+3]);
         printf("\nDepartment = %s", arr[k][o+4]);
         printf("\nGrade = %s", arr[k][o+5]);
         o = 0;
     }


 
     for(int i = 0; i < len; i++){
         p = (struct Node*) malloc(sizeof(struct Node));
         j = 0;
         p->id = (int)arr[i][j];
         strcpy(p->name, arr[i][j+1]);
         p->date = dateStrInt(arr[i][j+2]);
         strcpy(p->gender,arr[i][j+3]);
         strcpy(p->departmentCode, arr[i][j+4]);
         p->classGrade = (int)arr[i][j+5];
      
         j = 0;

         if(list == NULL){
             list = p;
             p -> next = NULL;
             last = p;
         }
         else {
             last -> next = p;
             p -> next = NULL;
             last = p;
         }
    }  
    return list;
}

void printList(struct Node *list, int len){
    struct Node *p;
    p = list;
    int cnt = 0;
    printf("\nThe list = ");
    while(p != NULL) {
       if(cnt != len - 1) {
           printf("\n{%d, %s, %d, %s, %s, %d} ---->",p->id, p->name, p->date,
           p->gender, p->departmentCode, p->classGrade);
           cnt++;
       }
       else
           printf("\n{%d, %s, %d, %s, %s, %d} ",p->id, p->name, p->date,
           p->gender, p->departmentCode, p->classGrade);
           p = p->next;
       }
 }

 int main(void) {

     struct Node *head = NULL;
     char filename[10];
     printf("Enter file name: ");
     scanf("%s", filename);
     int len = countLines(filename);

     struct Node* list = createList(head, len, filename);
     printList(list, len);
 }

test.txt 文件:

149875280;Burcu Aksu;04/04/1994;F;CS;3

180201201;Mustafa Kursat Yavuz Tur;12/06/1996;M;CS;3

输出:

Enter file name: test.txt
ID = 149875280
Name = Burcu Aksu
Birth Date = 04/04/1994
Gender = F
Department = CS
Grade = 3

ID = 180201201
Name = Mustafa Kursat Yavuz Tur
Birth Date = 12/06/1996
Gender = M
Department = CS
Grade = 3

The list =
{-1883589280, Burcu Aksu, 19940404, F, CS, -1883588780} ---->
{-1883588680, Mustafa Kursat Yavuz Tur, 19960612, M, CS, -1883588180}

为什么要声明 char 数组,而应该创建 Node 类型的数组。仅将字符串值类型转换为 int 不会正确转换 2 个整数字段。使用像atoi()这样的转换函数。 更改此行,

p->id = (int)arr[i][j];

p->id = atoi(arr[i][j]);