-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
*studentArr[count]->nameStudent = (char*)...

の定義を提供していませんがSTUDENT、これは確かに間違っています... nameStudent がchar*の場合、その頭文字を介して最初のバイトに格納しようとしています*(int)あなたのコードには、次の行のキャストなどの追加のバグがあります。C 言語をもっと勉強し、プログラムがその要件を満たしているかどうか、またどのように満たしているかに注意を払うことをお勧めします。C では高い精度が要求されます。

アップデート:

は配列であるためnameStudent、ポインターを割り当てることはできません。

コードには他にも多くのエラーが含まれています。

fgets(buffer, RECORDS_SIZE, fp); 

これは、1 つの STUDENT レコードではなく、RECORDS_SIZE バイトを読み取ります。

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

buffer[0]ここでは意味がありません。の最初の要素だけを設定しstudentArrても意味がありません..ループ内の他の要素を設定しません。fgetsループの外に呼び出しがあってはなりません...エラーやEOFがチェックされない呼び出し。

あなたのプログラムにはあまりにも多くのエラーや誤解が含まれており、コードを書かないと質問に答えることができません。

于 2013-04-22T20:39:54.380 に答える