删除C中具有char数组成员的结构的数组中的项



我在C中有这个结构,我用它做了一个数组

//Structure Definition
struct Employee
{
int Id;
char Name[20];
float Salary;
char Mobile[12];
};
int main()
{
int emparr_size = 3;
struct Employee emparr[emparr_size];
AddAllEmployees(emparr, emparr_size);
DisplayAllEmployees(emparr, emparr_size);
EditEmployee(emparr, emparr_size);
DeleteEmployee(emparr, emparr_size);
}
void AddAllEmployees(struct Employee * emp_ptr, int size)
{
for(int i=0; i<size; i++)
{
printf("Enter Employee %i Id: ", i+1);
scanf("%i", &emp_ptr->Id);
printf("Enter Employee %i Name: ", i+1);
scanf("%s", emp_ptr->Name);
printf("Enter Employee %i Salary: ", i+1);
scanf("%f", &emp_ptr->Salary);
printf("Enter Employee %i Mobile: ", i+1);
scanf("%s", emp_ptr->Mobile);
emp_ptr++;
}
}
void DisplayAllEmployees(struct Employee * emp_ptr, int size)
{
for(int i=0; i<size; i++)
{
printf("Employee %i Id is %i n",i+1, emp_ptr->Id);
printf("Employee %i Name is %s n",i+1, emp_ptr->Name);
printf("Employee %i Salary is %f n",i+1, emp_ptr->Salary);
printf("Employee %i Mobile is %s n",i+1, emp_ptr->Mobile);
emp_ptr++;
}
}

然后我要编辑和删除其中一个像

void EditEmployee(struct Employee * emp_ptr, int size)
{
int index;
printf("Enter Employee Index: ");
scanf("%i",&index);
if(index>0 && index<=size)
{
printf("new Employee %i Id ",index);
scanf("%i", &emp_ptr[index-1].Id);
printf("new Employee %i Name ",index);
scanf("%s", emp_ptr[index-1].Name);
printf("new Employee %i Salary ",index);
scanf("%f", &emp_ptr[index-1].Salary);
printf("new Employee %i Mobile ",index);
scanf("%s",  emp_ptr[index-1].Mobile);
}
else
{
printf("Invalid Index n");
}
}
void DeleteEmployee(struct Employee * emp_ptr, int size)
{
int index;
printf("Enter Employee Index: ");
scanf("%i",&index);
struct Employee temp={0,"",0,""};
if(index>0 && index<=size)
{
emp_ptr[index-1]=temp;
}
else
{
printf("Invalid Index n");
}
}

除了删除功能外,一切都很好。它只是用上面的空值替换已删除的员工成员:\

我尝试过这样的代码,它通过将数组中的其他项目转移到它的位置来删除一名员工

void DeleteEmployee(struct Employee * emp_ptr, int size)
{
int index;
printf("Enter Employee Index: ");
scanf("%i",&index);
struct Employee temp={0,"",0,""};
if(index>0 && index<=size)
{
for(int i=0; i<size-1; i++) // important  i < size-1
{
emp_ptr[index-1].Id=emp_ptr[index+1+i].Id;
emp_ptr[i+index].Name=emp_ptr[index+1+i].Name;
emp_ptr[i+index].Salary=emp_ptr[index+1+i].Salary;
emp_ptr[i+index].Mobile=emp_ptr[index+1+i].Mobile;
emp_ptr++;
}
}
else
{
printf("Invalid Index n");
}
}

这使我在编译时出错

error: assignment to expression with array type

这是因为name和phone成员是char:|的数组,我不能进行赋值所以试过这个

for(int i=0; i<size-1; i++) // important  i < size-1
{
emp_ptr[i+index].Id=emp_ptr[index+1+i].Id;
strcpy(emp_ptr[index+1+i].Name,emp_ptr[i+index].Name);
emp_ptr[i+index].Id=emp_ptr[index+1+i].Salary;
strcpy(emp_ptr[index+1+i].Mobile,emp_ptr[i+index].Mobile);
emp_ptr++;
}

但它不能正常工作!!!

我应该为名字和一部手机做一个循环,还是有另一种不循环的方法?

所以,在C中你不能"删除";来自数组中间的东西,就像在其他一些(通常是更高级别(语言中一样。所以,是的,你最初的删除功能实际上只是写"零";一切都结束了,所以它仍然在那里,但在其他方面是空的。你的第二个删除功能是向上移动以进行删除,这通常是更高级别的语言正在做的事情;"更新";一个条目较少的数组,并且是合理的。记住要跟踪你的数组有多满。IE,当你删除一些东西时,你会想把上面的东西下移,然后跟踪数组中现在只剩下'2'个条目。

重要提示:这里有两个概念:

  1. 最初分配的数组的大小。您不希望在数组中写入超过此项的内容(或程序转到boom(
  2. 您在任何时候的条目数。通常,您会希望将此值存储在第二个变量中

我认为您的上一个示例看起来应该有效,但因为您有一个从1开始的index,所以您可能希望更改数组索引,以便在所有位置添加-1

至于复制数据,当您有字符串时,您可能会考虑使用strncpy而不是strcpy,因为它更安全,并且当坏数据大于存储空间时(例如,当Name大于20时(,可以防止坏数据破坏程序。

最后,C基本上被分配了一块内存,用于存储数据。对于一个结构数组,它分配的内存是结构大小的3倍。所以你实际上可以做这样的事情:

memcpy(&emparr[0], &emparr[1], sizeof(struct Employee));

以将阵列中的n=1条目的内容复制到n=0点。这是一种移动所有内存的更快方法。

但是:正如上面的#2所指出的,您必须跟踪哪些条目是";在使用中";在结构中。您实际上无法删除它(如果不将数组重新分配到不同的大小,我在这里就不谈了(。

谢谢,@Wes Hardaker

我认为您的上一个示例看起来应该有效,但因为您有一个从1开始的索引,所以您可能需要更改数组索引,以便在所有位置添加-1。

它救了我

因此删除函数将是(不需要将数组重新分配到不同的大小:(

void DeleteEmployee(struct Employee * emp_ptr, int size)
{
int index;
printf("Enter Employee Index: ");
scanf("%i",&index);
if(index>0 && index<=size)
{
for(int i=0; i<size-1; i++) // important  i < size-1
{
emp_ptr[i+index-1].Id=emp_ptr[index+i].Id;
//strcpy does'nt prevent bad data from crashing your program when it's bigger than the storage space (for example when Name is bigger than 20).

emp_ptr[i+index-1].Salary=emp_ptr[index+i].Salary;
strncpy(emp_ptr[i+index-1].Name,emp_ptr[index+i].Name,size);
strncpy(emp_ptr[i+index-1].Mobile,emp_ptr[index+i].Mobile,size);
emp_ptr++;
}
struct Employee temp={0,"",0,""};
emp_ptr[index-1]=temp;
}
else
{
printf("Invalid Index n");
}
}

最新更新