-1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "queue.h"
#include "stack.h"

#define RECORDS_SIZE 100
#define NAME_SIZE    20

typedef struct Student
{
    char nameStudent[NAME_SIZE];
    int  TimeIn;
    int  TimeUpdate;
}STUDENT;

typedef struct TUTOR
{
    char nameTutor[NAME_SIZE];
    int TutorTIme;
    STUDENT *ptr;
}TUTOR;


QUEUE *queue1;
STACK *stack1;

void getData(STUDENT *studentArr[RECORDS_SIZE]);

int main (void)
{

    STUDENT *studentArr[RECORDS_SIZE];
    FILE *fp = NULL;

    getData(studentArr);

    return 0;
} 

void getData(STUDENT *studentArr[RECORDS_SIZE])
{
    FILE *fp;
    char fileName[NAME_SIZE];
    char buffer[RECORDS_SIZE];
    int count = 0;

    printf("Enter file name: ");
    gets(fileName);
    fp = fopen(fileName, "r");
    if (fp == NULL)
    {
       printf("Error! The file does not exist!\n");
    }

    fgets(buffer, RECORDS_SIZE, fp);
    *studentArr = (STUDENT*) malloc(buffer[0]*sizeof(STUDENT));
    while (fgets(buffer, RECORDS_SIZE, fp) != NULL)
    {
        printf("%s", buffer[count]);
       *studentArr[count]->nameStudent = (char*) malloc(strlen(buffer)*sizeof(char));
        studentArr[count]->TimeIn = (int) malloc(strlen(buffer)*sizeof(int));
        sscanf(buffer,"%[,],%d", *studentArr[count]->nameStudent, &studentArr[count]->TimeIn);

        printf("%s%d\n", studentArr[count]->nameStudent, &studentArr[count]->TimeIn);
       count++;
    }

    return;
}

有一个警告说,该赋值从没有强制转换的指针中生成整数 [默认启用]| 在我为 *studentArr[count]->nameStudent 分配内存的行上,为什么会收到此警告?

这就是我的文件的样子

4
A,10
B,12
C,60
D,120
tutorY

我尝试在第一行中读取,然后使用第一行上的数字来分配指向结构数组的指针并继续读取,然后分配结构的其余成员

我认为我的while循环错误,可能是我不应该调用fgets然后在while循环中重用它,因为它似乎在那里有错误。如何修复此功能?

预先感谢

4

2 回答 2

2

修改后的问题

nameStudent是一个 20 个字符的数组,我认为这可能会在分配时引起问题。

在这种情况下,您根本不需要动态分配nameStudent字段。创建学生结构时,名称的所有空间都将作为学生结构的一部分进行分配。


早期的观察

如果你真的有:

*studentArr[count]->nameStudent = (char*) malloc(strlen(buffer)*sizeof(char));

那么对于合理的类型nameStudent

 struct Xxxx
 {
     ...
     char *nameStudent;
     ...
 };

你有*在前面取消引用一个未定义的指向 char 的指针。这就是您收到警告的原因:

 assignment makes integer from pointer without a cast [enabled by default]

具有固定大小的学生姓名的结构可能会更好地为您服务:

 struct Xxxx
 {
     ...
     char nameStudent[32];
     ...
 };

于 2013-04-22T20:36:57.820 回答
2
*studentArr[count]->nameStudent = (char*)...

尽管您没有提供 的定义STUDENT,但这肯定是错误的……如果 nameStudent 是char*,您正试图通过该初始值将其存储到它的第一个字节中*。您的代码还有其他错误,例如(int)下一行的演员表。我建议对 C 语言进行更多的研究,并更加仔细地关注您的程序是否以及如何满足其要求。C 语言要求很高的精度。

更新:

由于nameStudent是一个数组,它不能也不应该有一个指针分配给它。

您的代码还包含许多其他错误。

fgets(buffer, RECORDS_SIZE, fp); 

这会读取 RECORDS_SIZE 个字节,而不是一条 STUDENT 记录。

*studentArr = (STUDENT*) malloc(buffer[0]*sizeof(STUDENT));

buffer[0]在这里没有意义。只设置 of 的第一个元素是studentArr没有意义的......你没有在循环中设置任何其他元素。循环外不应该有一个fgets调用......一个永远不会检查错误或EOF的调用。

你的程序包含太多错误和误解,如果不为你编写代码就无法回答你的问题。

于 2013-04-22T20:39:54.380 回答