0

我在这里的这个程序不能正确打印出来。这是输入:

有多少员工?2

输入员工 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 个文件中。

这是主要的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"
#include "personal.c"

LIST *start, *end;

int main(void)
{
int i, numEmp;  

PERSON person;

start=end=NULL;
printf("How many employees? ");
    scanf("%d", &numEmp);
PERSON employees[numEmp];

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", &person.bday.month, &person.bday.day,
          &person.bday.year, &person.age, &person.height, person.name);
    add(&start, &end, person);

}
for (i = 0; i < numEmp; i++)
{
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);

delete(&start, &end);
}

这是具有结构的列表:

#ifndef LIST_H_ /* to prevent re-definitions */
#define LIST_H_ /* that cause errors */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


typedef struct DATE
{
    int month;
    int day;
    int year;
} DATE;

typedef struct PERSON
{
    char name[41];
    int age;
    float height;
    DATE bday;

} PERSON;

typedef struct list 
{
PERSON data; 
struct list *next;
} LIST;

#endif

这就是我所有方法的所在:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"


int delete (LIST **head, LIST **tail){
    LIST *temp;

    if (*head == NULL)
        return -1;

    PERSON retVal = (*head)->data;

    if(*head==*tail){
        free(*head);
        *head=*tail=NULL;
    }
    else{
        temp=(*head)->next;
        free(*head);
        *head=temp;
    }

    //return retVal;
}

void add(LIST **head, LIST **tail, PERSON data){
    if(*tail==NULL){
        *head=*tail=(LIST *) malloc(sizeof(LIST));
        (*head)->data=data;//use arrow when struct is pointer. Use . if have direct access to struct
        (*head)->next=NULL;
    }
    else{
        (*tail)->next= (LIST *) malloc(sizeof(LIST));
        *tail=(*tail)->next;
        (*tail)->data=data;
        (*tail)->next=NULL;
    }
}
4

3 回答 3

2
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从未初始化的数组。

于 2013-03-11T04:16:59.253 回答
1

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

你所要做的就是valgrind在它前面运行你的程序,假设你在一个 Linux 系统上并且已经安装了 valgrind 包。

于 2013-03-11T04:16:00.573 回答
1

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

任何一个:

  1. 将数据读入您的 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);
    }
    
  2. 忘记 VLA,只打印链接列表的内容。

    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);
    
于 2013-03-11T04:21:01.677 回答