Stampare membri di una struttura

di Anonimizzato27694 il
11 risposte
Ciao, avrei un dubbio, se ho per esempio una struttura di questo tipo
typedef struct nomi {
char nome[20];
char cognome[20];
char fisso[20];
char mobile[20];
} Nomi;
e devo stampare tutti i membri della struttura uno dopo l'altro, esiste un modo rapido per stampare tutto quanto (tipo un ciclo)? o devo per forza fare
printf("%s ", Nomi.nome)
e così via, uno per volta. Perchè adesso i membri sono solo cinque quindi non sarebbe un problema, ma se ne avessi di più?
Grazie.

11 Risposte

  • Se li dimensionerai tutti a [20] potresti fare un ciclo con un puntatore. Prova
  • Strutture di grandi dimensioni sono spesso divisibili in sottostrutture. Puoi servirti di una funzione che scrive a schermo i valori di una struttura.

    Comunque il nome della tua struttura non ha alcun senso
  • Weierstrass ha scritto:


    Se li dimensionerai tutti a [20] potresti fare un ciclo con un puntatore. Prova
    Hai ragione non ci avevo pensato!
    Ti ringrazio
  • _Achille ha scritto:


    Strutture di grandi dimensioni sono spesso divisibili in sottostrutture. Puoi servirti di una funzione che scrive a schermo i valori di una struttura.

    Comunque il nome della tua struttura non ha alcun senso
    Grazie, comunque il nome è la prima cosa che mi è venuta in mente per fare l'esempio.
  • Scusa Weierstrass non è semplicemente una cosa tipo printf("%s %s %s %s ", Nomi.nome, Nomi.cognome, Nomi.fisso, Nomi.mobile) ?
    Che io sappia il ciclo for lo fai se hai un array di struct tipo nomi Nomi[20].

    Ok, lo so: dimmi dove sbaglio...
  • La richiesta era appunto quella di non fare la printf specificando il nome di tutti i membri...
  • @antragorn
    lui dice che siccome gli elementi (membri) di una struttura sono impaccati tra di loro, se ne conosci tipo e lunghezza, puoi calcolarne la posizione all'interno della struttura
    se poi sono tutti dello stesso tipo e della stessa lunghezza pui ciclarli attraverso un puntatore come se fossero in un array
    tipicamente siccome nella struttura indicata hanno tutti la stessa dimensione (20 caratteri)
    tu puoi ciclari con un for
    in pseudocodice
    
    for (int i=0; i<4; i++){
       printf("membro %c: %s", i, indirizzo della struttura più venti per i)
    }
    
    siccome l'indirizzo della struttura è un puntatore a struttura e a te serve un puntatore a char devi fare un po' di casting e giocare un po' con l'aritmetica dei puntatori, ma si riesce
    non è una cosa molto "ortodossa", nemmeno molto leggibile dopo un po': ti dimentichi in fretta di aver truccato, ma se serve funziona....
  • Solo una precisazione

    printf("membro %d: %s", i, indirizzo della struttura più venti per i)
  • Comunque intendevo questo
        Nomi p = {"Tizio", "Caio", "02555", "3334444"};
        for(char * ptr = &p.nome[0]; ptr < &p.nome[0] + 20 * 4; ptr += 20)
            printf("%s ", ptr);
  • Ovvero anche
    
    	for (int i=0; i<4; i++)
    	   printf("%s ", (char *)&p+i*20);
    
    e nel caso di un vettore
    
    	Nomi p[] = {
    		      { "Tizio", "Caio", "02555", "3334444" },
    		      { "Rossi", "Paolo", "12345", "2221111" },
    		      { "Verdi", "Enrico", "67890", "9887987" }
    	          };
    
    	for (int elem=0; elem<3; elem++)
    	{
    	  for (int campo=0; campo<4; campo++)
    	    printf("%s ", (char *)&p + elem*80 + campo*20);
    	  printf("\n");
    	}
    
  • Grazie a tutti; ho capito il concetto ma adesso devo spendere del tempo per provare.
Devi accedere o registrarti per scrivere nel forum
11 risposte