【发布时间】:2021-04-07 10:38:17
【问题描述】:
我正在尝试使用结构创建一个动态列表。现在我有了第一个为一个人存储信息的结构。另一个结构包含第一个结构,如下所示:
Tried my best to visualize it
employeeRegister
---------------- |-------|------|
registerE ------------> |city---|city--|
---------------- |London |Japan-|
numberOfemployee |pin----|pin---|
---------------- |0101010|101010|
------|2|------- |phone--|phone-|
|SAb123-|APPI20|
现在对我来说问题是我已经对其进行了编码,它可以工作,但不像提供的图像那样以正确的方式工作。
代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct personalInfo {
char city[20];
int pin;
char phone[14];
};
struct employeeRegister {
struct personalInfo registerE;
int numberOfemployee;
};
struct employeeRegister *allocateMemory(struct employeeRegister *oldMemory, int nrOfadd);
void addding(struct employeeRegister *addressToAdd, int *nrOfadd);
void printList(struct employeeRegister *allemp, int nrOfadd);
int main(void)
{
struct employeeRegister *employee = NULL;
int choice;
int nrOfaddress = 0;
do
{
printf("\n1 - add employee");
printf("\n2 - print employee list");
printf("\n3 - exit");
printf("\nWhat do you want to do? ");
scanf("%d", &choice);
while (getchar() != '\n');
switch (choice)
{
case 1:
employee = allocateMemory(employee, nrOfaddress);
if (employee == NULL)
break;
addding(&employee[nrOfaddress], &nrOfaddress);
break;
case 2:
printList(employee, nrOfaddress);
break;
case 3:
printf("Ending!\n");
free(employee);
employee = NULL;
break;
default:
printf("Invalid input\n");
break;
}
} while (choice != 3);
return 0;
}
struct employeeRegister *allocateMemory(struct employeeRegister *oldMemory, int nrOfadd)
{
struct employeeRegister *tempurary;
if (nrOfadd == 0)
tempurary = (struct employeeRegister *)calloc(1, sizeof(*tempurary));
else
tempurary = (struct employeeRegister *)realloc(oldMemory, sizeof(*tempurary)*(nrOfadd + 1));
return tempurary;
}
void addding(struct employeeRegister *addressToAdd, int *nrOfadd)
{
printf("City: ");
fgets(addressToAdd->registerE.city, 20, stdin);
addressToAdd->registerE.city[strlen(addressToAdd->registerE.city) - 1] = '\0';
do
{
printf("Pin: ");
fflush(stdin);
}
while ((scanf("%d", &addressToAdd->registerE.pin) != 1));
while (getchar() != '\n');
printf("Phone type: ");
fgets((addressToAdd->registerE.phone), 14, stdin);
addressToAdd->registerE.phone[strlen(addressToAdd->registerE.phone) - 1] = '\0';
(*nrOfadd)++;
addressToAdd->numberOfemployee = *nrOfadd;
}
void printList(struct employeeRegister *allemp, int nrOfadd)
{
for(int i = 0; i < nrOfadd; i++)
{
printf("%d. %-15s%-5.1d%s\n", i + 1, allemp[i].registerE.city,
allemp[i].registerE.pin, allemp[i].registerE.phone);
}
}
当我调试代码时,我得到了这个:
employeeRegister employeeRegister
---------------- |-------| ---------------- |-------|
registerE ------------> |city---| registerE ------------> |city---|
---------------- |London | ---------------- |London |
numberOfemployee |pin----| numberOfemployee |pin----|
---------------- |0101010| ---------------- |0101010|
------|1|------- |phone--| ------|2|------- |phone--|
|SAb123-| |SAb123-|
当我在代码块中运行代码时,在命令提示符下一切看起来都很好,但正如您所见,事实并非如此。我将如何编辑我的代码以实现第一张图像的结果?
这是我第一次发帖,如果有什么问题,请告诉我。
【问题讨论】:
-
每个
employeeRegister对象只包含一个registerE,这使得numberOfemployee变量毫无意义。这就是为什么您创建一个employeeRegisters 数组并使用额外变量来存储该数组长度的原因,不是吗? -
正如@UnholySheep 所说,更改
struct employeeRegister { struct personalInfo* registerE; int numberOfemployee; };并处理逻辑更改。 -
这是我的问题,我希望
employeeRegister将所有registerE保存在一个地方,我不希望它是employeeRegister的数组。相反,我想要一个employeeRegister的实例并将所有内容存储在registerE中,就像第一张图片一样。我只是不知道如何开始修复我的代码,因为当我运行它时我一开始没有看到它有任何问题,但后来使用调试器显示它是employeeRegister的数组 -
@BoR ok 会试试的
-
我想要
employeeRegister的一个实例并将所有内容存储在registerE中以在registerE、registerE中拥有多个记录必须是数组或指针,所以如果registerE是指针可以吗?
标签: c pointers struct dynamic-memory-allocation