PDA

Visualizza la versione completa : [C] Leggere un valore di tipo enum


torejx
21-12-2006, 16:43
Ciao ragazzi sono un novello del C... ho un programma dove ho un tipo enum
typedef enum Bibita {coca, fanta, birra} e una variabile
Bibita bibita
quando vado a leggere il valore inserito dall'utente
scanf("%s", bibita) durante l'esecuzione mi dà errore di segmentazione... penso che l'errore sia nello scanf (dato che non ricordo il formato con cui devo leggerlo) visto che se assegno alla variabile bibita un valore costante il prog funziona... Chi può aiutarmi?

MItaly
21-12-2006, 16:52
Gli enum sono solo raggruppamenti di nomi descrittivi per delle costanti, e vengono trattati dal compilatore come dei semplici interi, per cui non esiste un modo per fare sì che l'utente inserisca "coca" ed automaticamente la scanf imposti correttamente la variabile bibita; devi memorizzare la stringa inserita dall'utente in una stringa e determinare quale valore dell'enum è stato scelto con una serie di if e di strcmp.

torejx
21-12-2006, 16:54
Originariamente inviato da MItaly
Gli enum sono solo raggruppamenti di nomi descrittivi per delle costanti, e vengono trattati dal compilatore come dei semplici interi, per cui non esiste un modo per fare sì che l'utente inserisca "coca" ed automaticamente la scanf imposti correttamente la variabile bibita; devi memorizzare la stringa inserita dall'utente in una stringa e determinare quale valore dell'enum è stato scelto con una serie di if e di strcmp.

potresti farmi un esempio? ps non cambia nulla se all'utente chiedo di inserire un intero? per esempio "inserisci 0 per coca"?

MItaly
21-12-2006, 17:05
Originariamente inviato da torejx
potresti farmi un esempio?



#include <string.h>
/* ... */
Bibita bibita;
char buffer[1024];
scanf("%1023s",buffer); /*evitiamo i buffer overrun, per quanto improbabili */
strlwr(buffer);
if (!strcmp(buffer,"coca"))
bibita=coca;
else if (!strcmp(buffer,"fanta"))
bibita=fanta;
else if (!strcmp(buffer,"birra"))
bibita=birra;



ps non cambia nulla se all'utente chiedo di inserire un intero? per esempio "inserisci 0 per coca"?
Be', questo semplifica molto le cose:


Bibita bibita;
printf("Inserisci %d per coca, %d per fanta, %d per birra.",coca,fanta,birra);
scanf("%d",&bibita);

torejx
21-12-2006, 17:18
grazie mille 6 davvero gentile... penso che la seconda sia molto + semplice e immediata... io avevo provato a inserire un numero ma credo che nella scanf abbia usato &bibita invece che bibita e quindi continuava a dare errore... grazie ancora :ciauz:

MItaly
21-12-2006, 17:50
Ma... in realtà bisogna effettivamente scrivere &bibita, sono io che me ne sono dimenticato (correggo subito)... :stordita:

torejx
21-12-2006, 18:28
Originariamente inviato da MItaly
Ma... in realtà bisogna effettivamente scrivere &bibita, sono io che me ne sono dimenticato (correggo subito)... :stordita:

azz.. allora perchè mi dava errore? qui non ho il codice..stasera torno a casa controllo e ti faccio sapere...

Xaratroom
21-12-2006, 18:57
Scusate...
Ma io ho sempre letto un int o un unsigned e poi ho fatto un casting:

bibita = (Bibita) valoreLettto;

Mi sembra che un enum non possa essere letto da tastiera :master:

torejx
21-12-2006, 19:14
Originariamente inviato da Xaratroom
Scusate...
Ma io ho sempre letto un int o un unsigned e poi ho fatto un casting:

bibita = (Bibita) valoreLettto;

Mi sembra che un enum non possa essere letto da tastiera :master:

giusto... comunque proverò stasera e vi farò sapere...

MItaly
21-12-2006, 19:35
Originariamente inviato da Xaratroom
Scusate...
Ma io ho sempre letto un int o un unsigned e poi ho fatto un casting:

bibita = (Bibita) valoreLettto;

Mi sembra che un enum non possa essere letto da tastiera :master:
Un enum è un int.

Loading