我是一个初学者,使用DMA和数组结构概念编码来获取雇员的详细信息,如姓名、地址、雇员ID和年龄,使用数组并按升序排列接收到的详细信息。在这里,我无法解决将扫描的姓名存储在结构中的问题。当我给予两个以上的雇员计数值时,那么输出的名称是一些垃圾值。请帮助我修复它。我们正在输入的名称必须显示,但它没有显示。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct emp_details
{
char *address;
char *name;
char *Emp_ID;
int age;
};
void ascen_str(struct emp_details* employees_data,int num_of_emp);
int main()
{
int num_of_emp;
printf("Enter the number of employees: ");
scanf("%d",&num_of_emp);
struct emp_details* employees_data = malloc(num_of_emp*sizeof (employees_data));
int i=0;
for(int i=0;i<num_of_emp;i++)
{
employees_data[i].name=(char*)malloc(30*sizeof(char));
printf("Employe %d enter the Name: ",i+1);
scanf("%s",employees_data[i].name);
printf("%s",employees_data[i].name);
getchar();
//sscanf(emp_name,"%s\n",employees_data[i].name);
//fgets(employees_data[i].name,30,stdin);
employees_data[i].address = (char*)malloc(100*sizeof(char));
printf("Employe %d enter the Address: ",i+1);
//scanf("%s",employees_data[i].address);
fgets(employees_data[i].address,30,stdin);
employees_data[i].Emp_ID=(char*)malloc(10*sizeof(char));
printf("Employe %d enter the Employe ID: ",i+1);
scanf("%s",employees_data[i].Emp_ID);
printf("Employe %d enter the Age: ",i+1);
scanf("%d",&employees_data[i].age);
}
printf("\n\tEmploye details before sorting\n");
for(int i=0;i<num_of_emp;i++)
{
printf("Employe %d Name: %s\n",i+1,employees_data[i].name);
printf("Employe %d Address: %s",i+1,employees_data[i].address);
printf("Employe %d Age: %d\n",i+1,employees_data[i].age);
printf("Employe %d ID: %s\n\n",i+1,employees_data[i].Emp_ID);
}
ascen_str(employees_data,num_of_emp);
free(employees_data);
}
void ascen_str(struct emp_details* employees_data, int num_of_emp)
{
struct emp_details temp;
for (int i = 0; i < num_of_emp; i++) {
for (int j = i + 1; j < num_of_emp; j++) {
if (strcmp(employees_data[i].name, employees_data[j].name) > 0) {
temp = employees_data[i];
employees_data[i] = employees_data[j];
employees_data[j] = temp;
}
}
}
printf("\n\tEmploye details in ascending order by name\n");
for (int i = 0; i < num_of_emp; i++)
{
printf("Employe Name: %s\n",employees_data[i].name);
printf("Employe Address: %s",employees_data[i].address);
printf("Employe Age: %d\n",employees_data[i].age);
printf("Employe ID: %s\n\n",employees_data[i].Emp_ID);
}
}
2条答案
按热度按时间fdbelqdn1#
分配到被引用对象的大小,而不是指针的大小
@某个程序员老兄
如果可能,避免调整/强制转换为 * 类型 *,并分配给被引用的对象,如下所示。这样更容易正确编码、检查和维护。
避免使用
scanf()
@Fe2O3只使用
fgets()
如何?创建2个辅助函数。我们可以在以后改进这些辅助函数,以检测冗长的输入、
int
溢出、文件结束......简化记录阅读
mcdcgff02#
将此语句替换为
因为
employees_data
是一个指针,它的大小不是结构的大小