【发布时间】:2021-08-16 00:31:58
【问题描述】:
我在 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
那是因为姓名和电话成员是 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++;
}
它不能正常工作!!!
我应该为姓名和一部电话制作一个循环,还是有另一种不循环的方法?
【问题讨论】:
-
你应该使用 strcpy 将字符串分配给另一个字符串
-
更好的删除方法是创建一个函数,将源结构复制到目标结构,并将其用于移位
-
如果数组中有三个项,则项的索引应为 0、1 或 2。在进行数组索引之前,通常不应减去 1。您正在为可怕的“减一”错误做好准备
-
@TimRandall 我假设索引将作为 2 之类的位置输入 --> 数组中的第二项,所以我想减去 1。
-
@JatinParmar 所以你的意思是把 for 循环变成一个需要大小、数组、索引的函数!我应该如何更改其中的代码?请给我更多细节。
标签: arrays c pointers struct char