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

可変長配列 ( 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 に答える
1

プログラムをvalgrindの下で実行します。これは、コード内のメモリ エラーを自動的に検出する無料のツールです。コードが無効なものを読み書きしている場所を正確に強調表示できる可能性があります。

valgrindLinux システムを使用していて、valgrind パッケージがインストールされていると仮定して、プログラムを実行するだけです。

于 2013-03-11T04:16:00.573 に答える