Alla fine ci ho ragionato un po sopra e ho trovato una soluzione senza usare i doppi puntatori (anche se devo ostinarmi ad impararmeli) cmq scrivo il codice che funziona, e un bel po di codice ma spero possa servire a quacuno:
/*Modificare il programma di gestione del Caso di studio creando un'apposita funzione che richieda i dati di una persona
la funzione e richiamata tanto in fase di cancellazione tanto in quella di ricerca*/
#include<stdio.h>
#include<string.h>
#define MAXELE 30
#define DIM 31
#define MENU 0
#define OUT 100
#define INS 1
#define CAN 2
#define RIC 3
#define VIS 4
//Semplice struttura che modella una persona
struct per{
char nome[DIM];
char cognome[DIM];
char indirizzo[DIM];
int eta;
};
//Vettore persone
struct per anag[MAXELE];
//Numero elementi allocati nel vettore anag
int index=0;
int menPer();
int insPer(int);
void canPer();
struct per *cerPer(struct per);
void visPer(struct per *);
void eliPer(struct per *);
void ricPer();
void visAnagrafe();
void datiPer(struct per *);
int main (void)
{
int scelta=MENU;
while (scelta!=OUT) {
switch (scelta){
case MENU:
scelta=menPer();
if(scelta==MENU)
scelta=OUT;
break;
case INS:
index=insPer(index);
scelta=MENU;
break;
case CAN:
canPer();
scelta=MENU;
break;
case RIC:
ricPer();
scelta=MENU;
break;
case VIS:
visAnagrafe();
scelta=MENU;
break;
}
}
}
/*MENU*/
int menPer()
{
int scelta;
char invio;
int vero=1;
while(vero) {
printf("\n\n");
printf("\t\t\t ANAGRAFE");
printf("\n\n\n\t\t\t1. Immissione persona");
printf("\n\n\n\t\t\t2. Cancellazione persona");
printf("\n\n\n\t\t\t3. Ricerca persona");
printf("\n\n\n\t\t\t4. Visualizzazione anagrafe");
printf("\n\n\n\t\t\t0. Fine");
printf("\n\n\n\n\t\t\t Scegliere una opzione: ");
scanf("%d",&scelta);
scanf("%c",&invio);
switch(scelta) {
case 0:
case 1:
case 2:
case 3:
case 4:
return(scelta);
default:
printf("Opzione non accettata");
break;
}
}
return(0);
}
//inserisce persone all'angrafe
int insPer(int pos)
{
char invio;
if(pos>=MAXELE) {
printf(" Non si possono inserire altri nomi");
scanf("%c",&invio);
return(pos);
}
printf("\n\n\t\tINSERIMENTO PERSONA");
printf("\n\t\t---------------\n\n");
printf("\nCognome: ");
gets(anag[pos].cognome);
printf("\nNome: ");
gets(anag[pos].nome);
printf("\nIndirizzo: ");
gets(anag[pos].indirizzo);
printf("\nEta': ");
scanf("%d",&anag[pos].eta);
scanf("%c",&invio);
pos++;
return(pos);
}
//Cancella persona dall'anagrafe, se presente
void canPer()
{
char pausa;
struct per *ps;
struct per peo;
printf("\n\n\t\tCANCELLA PERSONA");
datiPer(&peo);
printf("\nc:%s\nn:%se:%d",peo.cognome,peo.nome,peo.eta);
//invoca ricerca persona
ps=cerPer(peo);
if(ps==NULL) {
printf("\nPersona non presente in anagrafe");
scanf("%c",&pausa);
return;
}
//invoca visualizza persona
visPer(ps);
printf("\nConfermi cancellazione? (S/N)");
scanf("%c",&pausa);
if(pausa=='S'||pausa=='s') {
eliPer(ps);
return;
}
}
//inserisce dati persona
void datiPer(struct per *p)
{
char pausa;
printf("\n\t\t---------------\n\n");
printf("\nCognome: ");
gets(p->cognome);
printf("\nNome: ");
gets(p->nome);
printf("\nEta': ");
scanf("%d",&p->eta);
scanf("%c",&pausa);
}
//elimina una persona dallanagrafe
void eliPer(struct per *p)
{
strcpy(p->cognome,"");
strcpy(p->nome,"");
strcpy(p->indirizzo,"");
p->eta=0;
}
//Ricerca persona se presente nell'anagrafe
void ricPer()
{
char pausa;
struct per *ps;
struct per peo;
//inserimento dati persona da ricercare
printf("\n\n\t\tRICERCA PERSONA");
datiPer(&peo);
//invoca ricerca persona
ps=cerPer(peo);
if(ps==NULL) {
printf("\nPersona non presente in anagrafe");
scanf("%c",&pausa);
return;
}
visPer(ps);
scanf("%c",&pausa);
return;
}
//visualizza persona
void visPer(struct per* p)
{
printf("\n\n--------------------\n");
printf("\n\t\tCognome: %s",p->cognome);
printf("\n\t\tNome: %s",p->nome);
printf("\n\t\tIndirizzo: %s",p->indirizzo);
printf("\n\t\tEta': %d",p->eta);
printf("\n\n--------------------\n");
}
//scanzione sequenziale del vettore anag alla ricerca di una persona cha abbia
//determinati cognome, nome ed eta
struct per *cerPer(struct per p)
{
int i;
printf("\nc:%s\nn:%se:%d",p.cognome,p.nome,p.eta);
for(i=0;i<=index;i++) {
if(strcmp(p.cognome,anag[i].cognome)==0)
if(strcmp(p.nome,anag[i].nome)==0)
if(p.eta==anag[i].eta)
return(&anag[i]);
}
return(NULL);
}
//visualizza l'anagrafe completa
void visAnagrafe()
{
int i;
char pause;
struct per *ps=&anag[0];
for(i=0;i<index;i++) {
visPer(ps++);
scanf("%c",&pause);
}
}
Grazie per la dritta del fgetsma me la puoi spiegare meglio