2013-09-22 67 views
0

我需要製作一個c程序來表示包含學生數據(姓名,分數和學號)的列表,但我無法弄清楚如何正確存儲學生姓名。在結構中使用char

我試圖使用指針,但當我嘗試分配一個新名稱時,它會覆蓋舊的名稱。

這是我使用的代碼...任何人都可以幫助我嗎?

lista.h

typedef struct _lista lista; 
typedef struct _dados dados; 

typedef struct _dados{ 
    int matricula; 
    float media; 
    char *nome; 
}_dados; 

typedef struct _lista { 
    int fim; 
    dados *d[max]; 
}_lista; 

lista* criar_lista(); 
dados* novo_dado(char *nome, int matricula, float media); 
void imprimir(dados *dado); 

lista.c

lista* criar_lista(){ 
    lista* L = (lista *) malloc(sizeof (lista)); 
    L->fim = -1; 
    return L; 
} 

dados* novo_dado(char *nome, int matricula, float media){ 

    dados* d = (dados *) malloc(sizeof (dados)); 
    d -> matricula = matricula; 
    d -> media = media; 
    d -> nome = nome; 
    return d; 
} 

void imprimir(dados *dado){ 
    printf("%s: ", dado->nome); 
    printf("%d ", dado->matricula); 
    printf("%.2f\n", dado->media); 
} 

的main.c

lista *L1; 
char nome[15]; 
int matricula; 
float media; 

L1 = criar_lista(); 



for (i=0;i<n;i++){ 
    fscanf(entrada,"%s", nome); 
    fscanf(entrada,"%d", &matricula); 
    fscanf(entrada,"%f", &media); 
    inserir(L1,novo_dado(nome,matricula,media)); 

} 

輸入:

8 
Vandre 45 7.5 
Joao 32 6.8 
Mariana 4 9.5 
Carla 7 3.5 
Jose 15 8 
Fernando 18 5.5 
Marcos 22 9 
Felicia 1 8.5 

輸出:

Felicia 45 7.5 
Felicia 32 6.8 
Felicia 4 9.5 
Felicia 7 3.5 
Felicia 15 8 
Felicia 18 5.5 
Felicia 22 9 
Felicia 1 8.5 and so on... 
+2

「當我嘗試分配新名稱時,它會覆蓋舊名稱。」 - 這就是賦值通常的作用。你期望發生什麼? –

+1

你一直使用相同的'char nome [15]'。 – lurker

回答

1

變化

d -> nome = nome; 

d -> nome = strdup(nome); 

這將在堆上分配一個新的字符數組,字符串複製到它,並將d->nome設置爲開頭。因此,每個dado將在其自己的陣列中擁有自己的nome字符串。

就在你破壞dado之前,別忘了打電話給free(d->nome);,否則你會有內存泄漏。