在C中的结构数组中存储多个输入

时间:2017-02-11 03:00:51

标签: 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-&gt; firstName),我只会输出用户的最终输入,这对我来说很有意义。我的问题是如何将输入存储到struct数组中。我想把strncpy输入到像sPtr [counter] - &gt; firstName这样的东西,但我似乎无法让代码工作。任何帮助,提示将非常感谢它。

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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

答案 1 :(得分:0)

您没有根据需要使用正确的数据结构。链表非常适合您的情况:

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

此外,反复调用realloc不是一个好习惯。大多数SO用户不鼓励strncpy超过strcpy的进一步使用。您甚至没有复制\0字符来标记字符串结尾。尝试使用上述数据结构,看看事情是如何落实到位的。