2017-02-11 50 views
2

我试图使用动态内存将信息存储在数据结构数组中。我已经设法使用我编写的代码存储一组信息,但是,由于我的代码只输出最后一个用户输入,因此我无法确定如何存储下一组输入。将多个输入存储在C中的结构数组中

#include <stdlib.h> 
#include <stdio.h> 
#include <strings.h> 

struct student { 
    int recordCount; 
    char *firstName; 
}; 


int i; 
char buffer[1000]; 


int main(){ 

    struct student *sPtr= (struct student*) malloc(sizeof(struct student)); 
    sPtr->recordCount = 1; 

    while (1){ 

    sPtr=realloc(sPtr, sizeof(struct student)* sPtr->recordCount); 
    sPtr->recordCount++; 

    printf("First Name:\n"); 
    fgets(buffer, 51, stdin); 
    if (strncmp(".\n", buffer, 51) == 0) break; 

    else{ 
    sPtr->firstName=(char*)malloc(sizeof(char)*(strlen(buffer))); 
    strncpy(sPtr->firstName, buffer, strlen(buffer)); 
    } 

} 

现在,如果我的printf(“%S”,sPtr->的firstName)我只输出用户,其意义的,我最后输入。我的问题是如何将输入存储到结构数组中。我正在考虑将输入变成像sPtr [counter] - > firstName这样的输入,但我似乎无法让代码正常工作。任何帮助,提示将不胜感激。

谢谢!

回答

0

在我看来,sPtr是作为学生结构数组的头部启动的,但是当你输入更多的学生信息时,你不停地写入相同的头结构,而不必将指针移动到下一个结构。

我的建议是,使用单独的指针newStuPtr,每次重新分配更多空间并增加记录数时,请将新学生指针向前移动。

但是为了使编码更容易,考虑使用链表或增量数组。

此外,您的代码中可能有两个错误。

  1. mallocrealloc没有free会导致内存泄漏。
  2. 对于新分配的第一个名字符串空间,您应该为strncpy添加额外的NULL结尾。

    sPtr->firstName=(char*)malloc(sizeof(char)*(strlen(buffer))); strncpy(sPtr->firstName, buffer, strlen(buffer));

+0

嘿谢谢你,我会试试看。所以我应该strcpy sptr-> firstName到新指针newStuPtr [x] - > firstName?如果我使用新的指针,printf将如何看起来像?例如'printf(“%s,%s”,newStuPtr [1] - > firstName,newStuPtr [2] - > firstName);'[x]是存储每个数据的结构数组?这只是一个部分程序,所以我没有免费提供,还有一些代码组件。 – George

+0

'newStuPtr'与'sPtr'类似,您可以通过从头部'sPtr [i]'索引来访问学生数组的第i个结构,或者使用'newStuPtr-> firstName'并将其转发给(i + 1)th struct by'newStuPtr + = 1'。请注意,有一个更大的问题,你想在哪里存储学生的姓名。如果'student'结构是针对个别学生的,那么就不需要在每个学生中存储(不同的)'recordCount'。您可以使用C编程手册来获得设计和数据结构方面的帮助,然后您会发现代码中的问题更少。 –

0

您没有使用正确的数据结构,为您的需求。链表是你的情况下,完美契合:

struct student { 
    char *firstName; 
    student * next; 
}; 

此外,调用realloc反复是不是一个好的做法。大多数SO用户不鼓励进一步使用strncpy而不是strcpy。你甚至不会复制\0字符来标记字符串结束。尝试使用上面的数据结构,看看事情是如何落实的。

+1

我看不到OP如何通过在结构数组上使用链表来获益。 – RoadRunner

+0

@RoadRunner,OP提到他想要使用动态内存分配。 – VHS

+1

动态分配结构数组有什么不对吗?他甚至说他想“使用动态内存将信息存储在数据结构数组中”。链表不作为数组。 – RoadRunner