Newsgroup: it.comp.lang.c++
Titolo: Utente inserisce char invece di int

Ciao :-)
Vado al sodo:
int a;
cin>>a;
//utente inserisce carattere
Crash del programma.
Come posso effettuare un controllo sul tipo di dato inserito?
Ho cercato su google, ma ho trovato solo funzioni per stabilire se una
stringa rappresenta un intero, e non per controllare se il valore che si sta
per immettere in una variabile di tipo int sia tale.
Ho provato con int isdigit(int a) , che però restituisce si un valore
diverso da 0 se il valore non è intero, ma non mi permette di far reinserire
all'utente il valore, finchè non immette un intero.
Infatti:
   do{
   cin>>a;
   is=isdigit(a);
   }while(is!=0);
non evita il ciclo infinito.
Come posso fare?
Grazie in anticipo, sav :-)
--
sav(at)
despammed.com

 reinserire all'utente il valore, finchè non immette un intero.
isdigit ti riporta unicamente se il carattere che passi come parametro
rappresenta una cifra da 0 a 9.

 Come posso effettuare un controllo sul tipo di dato inserito?
Allora quello che dici: isdigit() non serve....
Semplicemente basta leggere una stringa e poi convertirla in intero:
<CODE>
#include<iostream>
#include<string>
using namespace std;
int main()
{
 string str;
 int num;
 cin >> str;
 num=atoi(str.c_str());
 cout << num << endl;
 return 0;
}
</CODE>
Se il numero inserito e' un qualche cosa di "non numerico" tipo ad esempio
una stringa la funzione ritorna 0.
Questo e' il MINIMO, da qui lavoraci sopra....
Tommy

 ha scritto nel messaggio
news:oCq3a.246496$AA2.9...@news2.tin.it...



Semplicemente controllando lo stato dello stream.
Ossia:
int a;
cin >> a;
if(cin) { /*/ la lettura ha avuto successo */ }
else { /*/ la lettura e' fallita */ }
Nel caso in cui la lettura sia fallita, le cause possono
essere diverse.
Se cin.fail() == true allora quello che e' stato inserito non
e' un numero (ad esempio l'utente ha scritto "a209")
Se cin.bad() == true qualche grave errore di lettura si e' verificato
(ad esempio perdita di dati in una connessione remota)
Se cin.eof() == true allora si e' arrivati alla fine dello stream
(ad esempio alla fine di un file)
Tieni conto che comunque non sempre la distinzione fra fail() e bad()
e' chiara.
Saluti  Manlio Perillo

 else { /*/ la lettura e' fallita */ }
Si, ma come faccio a far reinserire il valore all'utente finchè non è un
valore accettabile? In tutti i modi in cui ho provato cado in infinite
loop...
Consigli?
Ciao
--
sav(at)
despammed.com

 wrote in message
news:ABP3a.252293$AA2.9...@news2.tin.it...

Nel caso di lettura fallita, dovresti svuotare il buffer di input e poi
ridare modo all'utente di inserire un nuovo input.
Maurus

 ha scritto nel messaggio
news:ABP3a.252293$AA2.9...@news2.tin.it...

Quando lo stream e' in 'fail' ogni successiva lettura fallisce.
Devi quindi resettare lo stato dello stream:
cin.clear();
Saluti  Manlio Perillo

 ha scritto nel messaggio
news:b2oi8e$1ej9v7$1...@ID-125555.news.dfncis.de...

No.
Innanzitutto non si puo' svuotare il buffer di input (ma solo quello di output).
Inoltre fintanto che non si resetta lo stato in 'good' ogni (mi sembra)
successiva
operazione sullo stream fallisce.
Saluti  Manlio Perillo


Anche dopo un cin.ignore()? O bisogna per forza fare un cin.clear()?
Maurus

 cin.clear();
Ok, grazie mille, risolto con:
<CODE>
while(!(cin>>a))
   {
   cin.clear();
   cin.ignore();
   }
//era quello che intendevi? Solo con cin.clear() andava cmq in infinite loop
</CODE>
Grazie, sav :-)
--
sav(at)
despammed.com

 ha scritto nel messaggio
news:IIU3a.254151$AA2.9...@news2.tin.it...

E' vero, non ci avevo pensato.
cin.ignore() serve perche', quando ad esempio si scrive "w12"
il carattere 'w' (che non e' un numero) viene lasciato nel buffer.
Saluti  Manlio Perillo

 ha scritto nel messaggio
news:b2p4t6$1eqf6o$1...@ID-125555.news.dfncis.de...

Se lo stream e' in 'fail' anche ignore fallisce.
Per caso per svuotare il buffer di input intendevi chiamare ignore?
Saluti  Manlio Perillo