使用C的结构问题

时间:2013-03-13 07:35:55

标签: c

我试图将字符串存储到动态分配的内存中。我能够将字符串分解并将它们存储在结构的成员中并在函数readFile内完美打印,但是当它在main中打印时,它只能打印最后一次扫描,其他一切都是null。我想,也许我没有正确分配结构数组。这是我的计划。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#ifdef _MSC_VER
#include <crtdbg.h>  // needed to check for memory leaks (Windows only!)
#endif

#define MEM_ERROR printf("Not enough memory\n")
#define FLUSH while( getchar() != '\n' )

typedef struct
{
char id[5];
char *name;
int *sales;
int total;
int low;
int high;
}PERSON;

typedef struct
{
int worker;
int weeks;
PERSON *pAry;
}HEADER;

//  Function Declaration
void    valiFile(char nameIn[]);
FILE*   openFile(char nameIn[]);
void    getHeader(FILE* fpFile, HEADER *pHead);
PERSON* aloPerson(int workers);
void    readFile(FILE* fpFile, HEADER *pHead);
char*   aloName(HEADER *pHead, int strCount);
void    repeat(char nameIn[]);


int main ( void )
{
//  Local Declaration
FILE* fpFile;
char  nameIn[25];
char *endPro = "end";
HEADER *pHead = (HEADER*)calloc(1, sizeof(HEADER));

//  Statement
printf("Please select file to to open.\nsales or sales_2: ");
scanf("%s", nameIn);
FLUSH;

do
{
    valiFile(nameIn);
    fpFile = openFile(nameIn);
    getHeader(fpFile, pHead);
    readFile(fpFile, pHead);

    //printf("%s\n", pHead->pAry[0].id);

    //free(pHead);

    repeat(nameIn);
}

return 0;
}// main

/* ========== valiFile ==========

========== */
void valiFile(char nameIn[])
{
//  Local Declaration
char *file = "sales";
char *file2 = "sales_2";
int i;
int check = 0;

//  Statement
do
{
    for(i = 0; nameIn[i]; i++)
    {
        nameIn[i] = tolower(nameIn[i]);
    }

    if(strcmp(file, nameIn) != 0)
    {
        if(strcmp(file2, nameIn) != 0)
        {
            printf("\nPlease enter a valid file.\n");
            printf("sales or sales_2: ");
            scanf("%s", nameIn);
            FLUSH;
        }
        else
            check = 1;
    }
    else
        check = 1;
}
while(check != 1)
;

return;
}// valiFile

/* ========== openFile ==========

========== */
FILE* openFile(char nameIn[])
{
//  Local Declaration
FILE* fpFile;
char *strSale = "sales";

//  Statement
if(strcmp(strSale, nameIn) == 0)
{
    fpFile = fopen("sales.txt", "r");
    if(fpFile == NULL)
    {
        printf("File didn't read correcty.\n");
        exit(100);
    }
}
else
{
    fpFile = fopen("sales_2.txt", "r");
    if(fpFile == NULL)
    {
        printf("File didn't read correcty.\n");
        exit(100);
    }
}

return fpFile;
}// openFile

/* ========================= getHeader ========================

============================================================*/
void getHeader(FILE* fpFile, HEADER *pHead)
{
//  Local Declaration
int worker, salesWeek, i;
PERSON *list;

//  Statement
fscanf(fpFile, "%d %d", &worker, &salesWeek);
list = aloPerson(worker);
HEADER header = {worker, salesWeek, list};
*pHead = header;

return;
}// getHeader

/* aloPerson

*/
PERSON* aloPerson(int worker)
{
//  Local Declaration
PERSON *list;

//  Statement
list =(PERSON*)calloc(worker, sizeof(PERSON));
if(list == NULL)
{
    MEM_ERROR, exit(103);
}

return list;
}// aloPerson

/* readFile

*/
void readFile(FILE* fpFile, HEADER *pHead)
{
//  Local Declaration
char temp[50];
int strCount = 0;
char *loc;
char *ptr;
int i;

//  Statement
fscanf(fpFile, "%*d %*d");
for(i = 0; i < pHead->worker; i++)
{
    while(fgets(temp, sizeof(temp), fpFile))
    {
        ptr = temp;
        loc = strchr(temp, ' ');
        strncpy(pHead->pAry[i].id, temp, (loc - ptr));
        ptr += (loc - temp);
        *ptr++;
        loc = strchr(temp, ';');
        strCount = (loc - ptr);

        pHead->pAry[i].name = aloName(pHead, strCount);

        strncpy(pHead->pAry[i].name, ptr, (loc - ptr));
        ptr += (loc - ptr);
        printf("%s\n", pHead->pAry[i].name);
    }
}


return;
}// readFile

/* aloName

*/
char* aloName(HEADER *pHead, int strCount)
{
//  Local Declaration
char *names;

//  Statement;
names = malloc((strCount + 1)*sizeof(char));

return names;
}

0 个答案:

没有答案