使用C语言解决结构问题

使用C语言解决结构问题,c,C,我试图将字符串存储到动态分配的内存中。我能够分解字符串并将其存储在结构的成员中,并在函数readFile中完美地打印它们,但在main中打印时,它只打印最后一次扫描,其他所有内容都是null。我在想,也许我没有正确分配结构数组。这是我的节目 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #ifdef _MSC_VER #include &l

我试图将字符串存储到动态分配的内存中。我能够分解字符串并将其存储在结构的成员中,并在函数
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;
}
#包括
#包括
#包括
#包括
#ifdef硕士学位
#包括//需要检查内存泄漏(仅限Windows!)
#恩迪夫
#定义MEM\u错误printf(“内存不足\n”)
#定义刷新时(getchar()!='\n')
类型定义结构
{
字符id[5];
字符*名称;
国际*销售;
整数合计;
int低;
int高;
}人;
类型定义结构
{
国际工人;
整数周;
个人*pAry;
}收割台;
//函数声明
无效有效文件(字符名在[]);
文件*openFile(char nameIn[]);
void getHeader(文件*fpFile,头*pHead);
个人*1人(内部工人);
无效读取文件(文件*fpFile,头*pHead);
字符*aloName(标题*pHead,整数strCount);
无效重复(字符名在[]);
内部主(空)
{
//地方申报
文件*fpFile;
char-nameIn[25];
char*endPro=“end”;
HEADER*pHead=(HEADER*)calloc(1,sizeof(HEADER));
//声明
printf(“请选择要打开的文件。\n销售或销售2:”;
scanf(“%s”,nameIn);
脸红
做
{
valiFile(nameIn);
fpFile=openFile(nameIn);
getHeader(fpFile,pHead);
readFile(fpFile,pHead);
//printf(“%s\n”,pHead->pAry[0].id);
//免费(pHead);
重复(命名);
}
返回0;
}//主要
/*============有效文件==========
========== */
无效有效文件(字符名在[])
{
//地方申报
char*file=“销售”;
char*file2=“sales_2”;
int i;
整数检查=0;
//声明
做
{
for(i=0;nameIn[i];i++)
{
nameIn[i]=tolower(nameIn[i]);
}
if(strcmp(file,nameIn)!=0)
{
if(strcmp(file2,nameIn)!=0)
{
printf(“\n请输入有效文件。\n”);
printf(“销售或销售2:”);
scanf(“%s”,nameIn);
脸红
}
其他的
检查=1;
}
其他的
检查=1;
}
while(检查!=1)
;
返回;
}//瓦利file
/*=============openFile==========
========== */
文件*openFile(字符名为[])
{
//地方申报
文件*fpFile;
char*strSale=“销售”;
//声明
if(strcmp(strSale,nameIn)==0)
{
fpFile=fopen(“sales.txt”、“r”);
如果(fpFile==NULL)
{
printf(“文件未正确读取。\n”);
出口(100);
}
}
其他的
{
fpFile=fopen(“sales_2.txt”,“r”);
如果(fpFile==NULL)
{
printf(“文件未正确读取。\n”);
出口(100);
}
}
返回fpFile;
}//开放文件
/*========================================getHeader========================
============================================================*/
void getHeader(文件*fpFile,头*pHead)
{
//地方申报
int工人,销售周,i;
个人*名单;
//声明
fscanf(fpFile、%d%d、&worker、&salesWeek);
列表=一个人(工人);
HEADER={worker,salesWeek,list};
*pHead=收割台;
返回;
}//getHeader
/*孤独的
*/
个人*1个人(内部工作人员)
{
//地方申报
个人*名单;
//声明
列表=(人*)calloc(工人,大小(人));
if(list==NULL)
{
内存错误,退出(103);
}
退货清单;
}//孤独的
/*读取文件
*/
无效读取文件(文件*fpFile,头*pHead)
{
//地方申报
煤焦温度[50];
int strCount=0;
char*loc;
char*ptr;
int i;
//声明
fscanf(fpFile,“%*d%*d”);
对于(i=0;iworker;i++)
{
while(fgets(temp、sizeof(temp)、fpFile))
{
ptr=温度;
loc=strchr(温度,”);
strncpy(pHead->pAry[i].id,temp,(loc-ptr));
ptr+=(loc-温度);
*ptr++;
loc=strchr(温度“;”);
strCount=(loc-ptr);
pHead->pAry[i].name=aloName(pHead,strCount);
strncpy(pHead->pAry[i].名称,ptr,(loc-ptr));
ptr+=(loc-ptr);
printf(“%s\n”,pHead->pAry[i].name);
}
}
返回;
}//读取文件
/*阿洛名称
*/
字符*aloName(标题*pHead,整数strCount)
{
//地方申报
字符*名称;
//声明;
名称=malloc((strCount+1)*sizeof(char));
返回姓名;
}

启用编译器中的所有警告和调试信息(例如Linux上的
gcc-Wall-g
)。然后学习使用调试器(
gdb
在Linux上)和一些内存泄漏检测器(
valgrind
在Linux上)。另外,请缩进您的代码,并展示一个最小的例子。请不要试图用模糊的宏重新发明C语言。它使你的代码不那么清晰,可读性差,也更难调试。我不知道如何打开所有的警告。老师从来没有在我们的IDE上讨论过如何做这件事,但我实际上解决了问题所在。一定要回答你们自己的问题来解释你们的解决方案。它可以帮助别人。