C语言的打印输出有问题

C语言的打印输出有问题,c,pointers,struct,linked-list,C,Pointers,Struct,Linked List,我这里的程序打印不正确。以下是输入: 有多少员工?二, 输入员工1信息:月/日/年、年龄、身高、姓名: 3/21/34、43、3.4、hdsfgdf 输入员工2信息:月/日/年、年龄、身高、姓名: 4/44/44,44,6.2,dfgtesas 这是输出: 员工1信息: 0/-1081689528/134514548, 16564212, 0.0, �� 员工2信息: 0/1/14608664, -1217230008, 0.0, ��ܹ���� 我唯一的猜测是我没有正确填充数组,或者可能是打印

我这里的程序打印不正确。以下是输入:

有多少员工?二,

输入员工1信息:月/日/年、年龄、身高、姓名: 3/21/34、43、3.4、hdsfgdf

输入员工2信息:月/日/年、年龄、身高、姓名: 4/44/44,44,6.2,dfgtesas

这是输出:

员工1信息: 0/-1081689528/134514548, 16564212, 0.0, ��

员工2信息: 0/1/14608664, -1217230008, 0.0, ��ܹ����

我唯一的猜测是我没有正确填充数组,或者可能是打印出了地址而不是数据。我这样假设对吗?任何一点建议都会有帮助。非常感谢你

我的代码在3个文件中

这是主要问题:
#包括
#包括
#包括
#包括“list.h”
#包括“personal.c”
列表*开始,*结束;
内部主(空)
{
int i,numEmp;
个人;
开始=结束=空;
printf(“有多少员工?”);
scanf(“%d”&numep);
个人雇员[numEmp];
对于(i=0;i
以下是包含以下结构的列表:
#ifndef LIST_H/*防止重新定义*/
#定义导致错误的列表\u H\u/**/
#包括
#包括
#包括
类型定义结构日期
{
整月;
国际日;
国际年;
}日期;
typedef结构人
{
字符名[41];
智力年龄;
浮动高度;
日期B日;
}人;
类型定义结构列表
{
人员数据;
结构列表*下一步;
}名单;
#恩迪夫
这就是我所有的方法:
#包括
#包括
#包括
#包括“list.h”
整数删除(列表**头,列表**尾){
列表*临时;
如果(*head==NULL)
返回-1;
PERSON retVal=(*head)->数据;
如果(*头部==*尾部){
自由(*头);
*head=*tail=NULL;
}
否则{
温度=(*头部)->下一步;
自由(*头);
*压头=温度;
}
//返回返回;
}
作废添加(列表**头、列表**尾、人员数据){
如果(*tail==NULL){
*头=*尾=(列表*)malloc(sizeof(列表));
(*head)->data=data;//当struct是指针时使用箭头。如果可以直接访问struct,则使用
(*head)->next=NULL;
}
否则{
(*tail)->next=(LIST*)malloc(sizeof(LIST));
*tail=(*tail)->next;
(*尾部)->数据=数据;
(*tail)->next=NULL;
}
}
在下运行您的程序。这是一个免费的工具,可以自动检测代码中的内存错误。它可能会为您突出显示代码读取或写入无效内容的确切位置

假设您在Linux系统上并安装了valgrind软件包,您所要做的就是使用前面的
valgrind
运行程序。

在下面运行您的程序。这是一个免费的工具,可以自动检测代码中的内存错误。它可能能够为您准确地突出显示代码的读写位置无效的东西

printf("Employee %d information:\n%d/%d/%d, %d, %.1f, %s\n", i+1, 
        employees[i].bday.month, employees[i].bday.day, employees[i].bday.year,
         employees[i].age, employees[i].height, employees[i].name);
假设您在Linux系统上并安装了valgrind软件包,那么您所要做的就是使用前面的
valgrind
运行程序

printf("Employee %d information:\n%d/%d/%d, %d, %.1f, %s\n", i+1, 
        employees[i].bday.month, employees[i].bday.day, employees[i].bday.year,
         employees[i].age, employees[i].height, employees[i].name);
您正在尝试打印从未初始化的
employees
数组


您正在尝试打印从未初始化的
员工
数组。

您创建了一个可变长度数组(
员工
和一个链接列表。您将元素添加到链接列表中,但尝试打印可变长度数组的内容(您从未写入任何内容)

要么:

  • 将数据读入您的VLA

    for (i = 0; i < numEmp; i++)
    {
        printf("Enter employee %d info: month/day/year, age, height, name:\n", i+1);
        scanf("%d/%d/%d,%d,%f,%s", &employees[i].bday.month, &employees[i].bday.day,
          &employees[i].bday.year, &employees[i].age, &employees[i].height, employees[i].name);
    }
    

  • 您可以创建一个可变长度数组(
    employees
    和一个链接列表。您可以向链接列表中添加元素,但尝试打印可变长度数组的内容(您从未写入任何内容)

    要么:

  • 将数据读入您的VLA

    for (i = 0; i < numEmp; i++)
    {
        printf("Enter employee %d info: month/day/year, age, height, name:\n", i+1);
        scanf("%d/%d/%d,%d,%f,%s", &employees[i].bday.month, &employees[i].bday.day,
          &employees[i].bday.year, &employees[i].age, &employees[i].height, employees[i].name);
    }
    

  • 我建议您添加printf()调用以调试代码或启动IDE并使用其调试器。我建议您添加printf()调用以调试代码或启动IDE并使用其调试器。PERSON employees[numEmp];不是在初始化它吗?@Hokerie:这是在声明它,初始化它意味着为它分配一个初始值。所以我想添加(&start,&end,PERSON);没有正确填写?@Hokerie,填写链接列表不是指
    employees
    array.PERSON-employees[numEmp];没有初始化它吗?@Hokerie:这是声明,初始化它意味着给它分配一个初始值。所以我想添加(&start,&end,PERSON);没有正确填写?@Hokerie,填写链接列表不是在
    员工
    数组中。什么时候使用->代替是合适的?@Hokerie:
    x->y
    相当于
    (*x).y
    因此,只有当
    x
    是指向结构的指针而不是实际的结构对象时,才能使用
    ->
    。何时使用->而不是?@Hokerie:
    x->y
    相当于
    (*x).y
    因此,只有当
    x
    是指向结构的指针而不是实际的结构对象时,才能使用
    ->
    for (i = 0; i < numEmp; i++)
    {
        printf("Enter employee %d info: month/day/year, age, height, name:\n", i+1);
        scanf("%d/%d/%d,%d,%f,%s", &employees[i].bday.month, &employees[i].bday.day,
          &employees[i].bday.year, &employees[i].age, &employees[i].height, employees[i].name);
    }
    
    i = 0;
    for (LIST *item = start; item != NULL; item = item->next)
        printf("Employee %d information:\n%d/%d/%d, %d, %.1f, %s\n", ++i, item->data.bday.month, item->data.bday.day, item->data.bday.year, item->data.age, item->data.height, item->data.name);