我正在尝试使用动态内存将信息存储在数据结构数组中。我已经设法使用我编写的代码存储一组信息,但是,我在确定如何存储下一组输入时遇到问题,因为我的代码只会输出最后一个用户输入。
#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这样的东西,但我似乎无法让代码工作。任何帮助,提示将非常感谢它。
谢谢!
答案 0 :(得分:0)
在我看来,sPtr
是作为学生结构数组的标题启动的,但是当您输入更多学生信息时,您将继续写入相同的标头结构,而不将指针移动到下一个结构。
我的建议是,使用单独的指针newStuPtr
,每次重新分配更多空间并增加记录数时,向前移动新学生指针。
但是为了使编码更容易,考虑使用链表或增量数组。
此外,您的代码中可能存在两个错误。
malloc
和realloc
没有free
会导致内存泄漏。对于新分配的名字字符串空间,您应该考虑由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
字符来标记字符串结尾。尝试使用上述数据结构,看看事情是如何落实到位的。