[C] Passaggio da una funzione della dimensione di un array di stringhe dinamico
Salve, vi scrivo per un problema a me difficile da risolvere. Premetto che sono un autodidatta ed ho purtroppo studiato il C da solo . Mi sono trovato dinanzi alla creazione di questo programma che richiede i seguenti punti :
1 acquisizione di un insieme di nickname e la lista amici per ogni nickname ;
2 visualizzazione a schermo dei nickname e delle loro liste amici.
Il codice è il seguente :
Il mio problema è il passaggio della dimensione di ogni lista amici che è diversa per ogni nick alle altre funzioni ovvero il "dim=strlen(insieme.lista amici)". Ho provato l'strlen ma ovviamente essendo un array di puntatori da errori , ho provato il sizeof ma essendo un array dinamico non funziona . Scusate in anticipo per il post non so come funziona il linking del codice ,ovviamente il testo non rispetta l'ordine delle parentesi , in ogni caso l'unico problema del codice è quel strlen . Vi ringrazio in anticipo
1 acquisizione di un insieme di nickname e la lista amici per ogni nickname ;
2 visualizzazione a schermo dei nickname e delle loro liste amici.
Il codice è il seguente :
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct{ char nickname[30]; char **lista_amici; }utente; utente *insieme; void ist (void); void ac (utente *insieme, int n); void print (utente *insieme, int n); int main (){ FILE *ptr; int scelta; int size; if((ptr=fopen("test.txt","w+"))==NULL){ puts("ERRORE"); } else{ ist(); while(1){ printf("?"); scanf("%d", &scelta); switch(scelta){ case 1: printf("Inserire numero di nickname"); scanf("%d", &size); insieme = malloc(size); ac(insieme,size); break; case 2: print(insieme, size); break; case 3: printf("Chiusura programma"); exit(0); } } fclose(ptr); } system("PAUSE"); return 0; } void ist (void){ printf("Benvenuto\n"); printf("Puo' scegliere tra le seguenti opzioni\n"); printf("1 : Acquisizione nickname\n"); printf("2 : Visualizzazione nickname e lista amici per ogni nickname\n"); printf("3: Chiusura programma\n"); printf("Inserire scelta\n"); } void ac (utente *insieme, int n){ int scelta1; int dim2; for(unsigned int i=0; i<n ; i++){ printf("Inserire il nickname dell'utente"); scanf("%s", insieme[i].nickname); printf("Vuoi inserire degli amici?"); printf("Premere 1 per accettare , 0 per non accettare"); scanf("%d", &scelta1); if (scelta1 == 1){ printf("Inserire numero di amici"); scanf("%d", &dim2); insieme[i].lista_amici = (char**)calloc(dim2,sizeof(char*)); for(unsigned int j=0; j<dim2 ; j++){ printf("Inserire amicizia"); scanf("%s", insieme[i].lista_amici[j]); } free(insieme[i].lista_amici); } } } void print(utente *insieme, int n){ int dim; for(unsigned int i=0; i<n ; i++){ dim=strlen(insieme[i].lista_amici); printf("Questo è il nick --> %s\n", insieme[i].nickname); for (unsigned int j=0; j<dim ; j++){ printf("Questo è l'amico ---> %s\n", insieme[i].lista_amici[j]); } } }
Il mio problema è il passaggio della dimensione di ogni lista amici che è diversa per ogni nick alle altre funzioni ovvero il "dim=strlen(insieme.lista amici)". Ho provato l'strlen ma ovviamente essendo un array di puntatori da errori , ho provato il sizeof ma essendo un array dinamico non funziona . Scusate in anticipo per il post non so come funziona il linking del codice ,ovviamente il testo non rispetta l'ordine delle parentesi , in ogni caso l'unico problema del codice è quel strlen . Vi ringrazio in anticipo
Risposte
L'unico modo che hai è quello di salvarti la dimensione dell'array nella struttura utente.