PDA

Visualizza la versione completa : [ANSI C] Vettore di struttura, il loop for clona le componenti?Come è possibile?


geopardy
09-03-2008, 04:37
Ciao a tutti,
Sto cercando di costruire una semplice rubrica basata su un vettore di tipo struttura.
Funziona tutto correttamente, tranne il fatto che gli inserimenti attraverso le scanf() all'interno di un loop for clonano tutto il vettore
con l'ultimo inserimento eseguito.... (provare per credere)
Perchè succede questo???
ecco il listato:

#include<stdio.h>
#include<stdlib.h>
#define MAXV 10

main()
{


int i;
char name[50];
char phone[50];


struct rubrica /* definisco la struttura */

{
char *nome;
char *telefono;
};

struct rubrica miarubrica[MAXV], *p_rubrica; /* istanzio un vettore tipo rubrica e un puntatore tipo rubrica */

p_rubrica = miarubrica; /* assegno il puntatore alla prima componente */


for (i = 0; i< MAXV; i++) {/* popolo il vettore con tutti record uguali */
(p_rubrica+i)->nome ="Pippo";
(p_rubrica+i)->telefono = "0123456789";
}


(p_rubrica+4)->nome = "Pluto"; /* esegue una modifica alla componente di posizione 5*/
(p_rubrica+4)->telefono ="00000";

for (i = 0; i < MAXV; i++){ /* loop per la popolazione ciclica, partendo dalla componente 0 in avanti */
printf("Rec %d\tNome:\tTelefono:",i);
scanf("%s %s",name,phone);
(p_rubrica+i)->nome = name;
(p_rubrica+i)->telefono = phone;
}/* perchè il vettore si popola con tutte copie dell'ultimo inserimento ?????? */

for (i = 0; i < MAXV; i++) /* loop per l'output */
printf("Siamo al n. %d: nome: %s telefono: %s\n", i, (p_rubrica+i)->nome, (p_rubrica+i)->telefono); /* ecco repplicata sempre l'ultima riga in ogni componente del vettore */
}
Ho provato ache con altri metodi, usando gli indici al posto dei puntaori, a copiare l'intera struttura in una componente di un analogo vettore struttura, il risultato non cambia. Da notare che solo i membri di tipo stringa sono tutti uguali all'ultimo inserimento , un eventuale intero all'interno della struttura manterrebbe il valore assengato.
Cos'è che sbaglio???

oregon
09-03-2008, 08:29
Succede perche' tu non hai ancora chiaro il concetto di stringa e di puntatore a stringa in C ... Hai scritto il codice quasi come se fosse BASIC ...

Se all'interno della struttura hai due "puntatori" a stringa, quando vuoi assegnare una stringa variabile al puntatore, ne devi PRIMA allocare lo spazio dinamicamente e DOPO copiare il contenuto tramite la funzione strcpy ...

Se assegni a tutte le stringhe (come stai facendo) il puntatore al buffer "name", alla fine tutte le stringhe punteranno allo stesso contenuto (quello di name) ovvero al suo ultimo contenuto assegnato ...

geopardy
09-03-2008, 12:18
Grazie Oregon per avermi risposto, è chiedere troppo poter vedere qualche esempio?
(sicneramente ho capito quello che mi suggerisci ma non so bene da che parte iniziare)
Magari mi dai un link a qualcosa dove viene presentato bene bene l'argomento??
Grazie ;)

oregon
09-03-2008, 14:55
L'argomento in questione sono le stringhe e i puntatori ... e' un argomento trattato in TUTTI i libri di base del C ... (presumo tu stia studiando con un libro ...).

Non so se hai studiato gia' l'allocazione dinamica della memoria, ma potresti affrontare i problemi gradualmente, cambiando la struttura in questo modo



struct rubrica
{
char nome[50];
char telefono[50];
};


e modificando il codice in maniera opportuna ... ad esempio, il codice per popolare la struttura diventa



for (i = 0; i<MAXV; i++)
{
strcpy(miarubrica[i].nome, "Pippo");
strcpy(miarubrica[i].telefono, "0123456789");
}


... il resto saprai modificarlo da solo ... e mi raccomando usa la strcpy ...

geopardy
09-03-2008, 16:25
Studio su una traduzione del Kernighan Ritchie, alcuni concetti sono espressi in maniera poco approfondita, forse perchè si rivolge a un lettore già esperto.
Ecco, ho capito che il tipo di assegnazione che usavo io non faceva altro che passare l'indirizzo (o riferiemento) di una locazione di memoria ai vari componenti struttura ergo passava sempre la medesima stringa.
Stavo giusto guardando la strcpy, il KR (Kernighan Ritchie) a tale proposito dice dice: "...Sarebbe bello potere scrivere semplicemente s=t, ma questo copia soltanto i puntatori," quello che ho fatto io, "non i caratteri. Per copiare i caratteri, abbiamo bisogno di un ciclo..." e qui viene presentata la strcpy in varie versioni.
Che dire?
Decisamente mi sei stato di grande aiuto, mi hai messo sulla buona strada. GRAZIE!!! :ciauz:

oregon
09-03-2008, 16:28
Di nulla ... pero' vedi ... nei libri c'e' scritto tutto ... bisogna leggerli PRIMA di scrivere il codice ... :ciauz:

Loading