PDA

Visualizza la versione completa : [c] problemi son strutture


Daisyland
04-03-2012, 15:30
Non ricordo una cosa, vorrei capire come funzionano i valori assegnati ad una struttura
Se io faccio cosi' funziona, asseggnando il valore ad elenco.cognome tramite la scanf()


#include <stdio.h>


struct utente{
char nome[20];
char cognome[20];
char telefono[10];
};

struct utente elenco;

main()
{
printf("\nInserire il cognome ");
scanf("%s", elenco.cognome);

printf("\ncognome = %s\n", elenco.cognome);
}


Se invece della scanf per assegnare il valore ad
elenco.cognome
digito


elenco.cognome = "esempio";

mi da' l'errore


incompatible types in assignment

Come mai non posso assegnarlo col secondo metodo ?

4ndr34s92
04-03-2012, 15:35
mmmhm penso tu debba provare ad utilizzare la strcpy, che copia una stringa in una variabile.

http://www.cplusplus.com/reference/clibrary/cstring/strcpy/

ramy89
04-03-2012, 15:55
struct utente{
const char *nome;
const char* cognome;
const char *telefono;
};

int main(int arhc, char**argv)
{
struct utente elenco;
elenco.cognome="pippo";
}


Attenzione alla parola chiave const, perchè in questo caso se dici elenco.cognome="pippo", la stringa "pippo" verrà messa nell' area di sola lettura del programma.Per cui se accedi ai suoi campi come ad esempio:


// se cognome era char* e non const char*
elenco.cognome[1]='c'; // segmentation fault

Va in segmentation fault perchè la stringa è di sola lettura.
Dichiare const char* è quindi solo una forma di tutela.Non è strettamente necessario.
L' incompatibilità è dovuta al fatto che "pippo" è di tipo const char* e non di tipo char[20].
Se vuoi anche accedere in scrittura alle stringhe puoi usare la strcpy e dichiarare array di char:


// cognome è di tipo char[20]
strcpy(elenco.cognome,"pippo");

Daisyland
04-03-2012, 16:02
No, ma con la strcpy so che funziona, solo non capivo come mai non si poteva fare l'assgnamento diretto in quella maniera e la differenza che c'era con la scanf, che invece funziona.

ramy89
04-03-2012, 19:51
Mi ero dimenticato di dire la cosa più ovvia :fagiano:
char cognome[20] è un array e non un puntatore.
Dicendo elenco.cognome="pippo" stai assegnando l' array ad un' altra area di memoria.
Ma un array è statico, è nello stack e non gli puoi re-assegnare l' indirizzo.

Daisyland
04-03-2012, 20:17
Ma la scanf non agisce nella stessa maniera ?
Nel senso che do' un valore da tastiera ad una stringa e questo diventa il valore dell'array.
O la scanf in pratica fa quello che fa la strcpy, nel senso che copia il valore della stringa inserita da tastiera nel'array ?

ramy89
04-03-2012, 20:33
La scanf con %s scrive i valori letti da input nell' array di char.

Daisyland
04-03-2012, 20:43
Appunto, non capivo la differenza tra scriverli direttamente assegnando il valore di una stringa all'arrat e facendoglieli assegnare tramite scanf.

ramy89
04-03-2012, 21:20
Ora è chiaro?

Daisyland
04-03-2012, 21:53
Si'

Loading