|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
Help C++
Ciao a tutti,
Ho un problema con C++... Come faccio a sapere se una variabile inserita tramite cin>>x; è un double oppure no? Grazie |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
double x; if(cin >> x) cout << "Giusto" << endl; else cout << "Sbagliato" << endl; |
![]() |
![]() |
![]() |
#3 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
grazie per la risposta, però non ho capito come posso usarlo qui:
Codice:
int n =0; while (n<5) { //controlliamo che i lati siano più di 4 cout<<"Inserisci il numero dei lati ( >4 ): "; cin>>n; } ![]() |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2002
Città: Imola
Messaggi: 1116
|
Codice:
int x; do { if(cin >> x) cout << "Giusto" << endl; else cout << "Sbagliato" << endl; } while(x < 5); |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
anche questo codice produce un loop se inserisci un char
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
do { while(!(cin >> x)) cout << "Devi inserire un numero intero" << endl; if(x >= 5) cout << "Devi inserire un numero intero minore di 5" << endl; } while(x < 5); |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
ancora loop...
![]() |
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Bisogna ricordarsi di "ripulire" il canale dopo l'errore... se non lo fai continua a rimanerti il vecchio input, da qui il loop.
ad esempio (non bellissimo lo ammetto ![]() Codice:
int n; while(true) { cin >> n; if ( ! cin ) { cout << "Non un numero" << endl; // ripuliamo il canale... cin.clear(); while( cin.peek() != '\n' ) cin.ignore(); } else if ( n >= 5 ) cout << "Il numero deve essere < 5 " << endl; else { cout << "Blabla!" << endl; break; } } |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
In alternativa si puo' usare uno stream sulle stringhe per controllare il tutto:
Codice:
#include <iostream> #include <string> #include <sstream> using namespace std; /*...*/ int n; while( true ) { string s; cin >> s; // in alternativa getline(cin,s); istringstream in(s); in >> n; if ( ! in ) { cout << "Non un numero" << endl; } else if ( n >= 5 ) { cout << "Il numero deve essere < 5 !" << endl; } else { cout << "ok!" << endl; break; } } Ri-ri-edit: maledette tabulazioni ! ![]() |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jun 2002
Città: Firenze
Messaggi: 630
|
Anche se poco elegante, questo può funzionare? (non provato)
Codice:
char x[100]; char *stopstring; long ll; do { cin>>x; ll = strtol(x,stopstring,10); } while((ll==0) && (!strcmp(x,"0"))); Codice:
char x[100]; char *stopstring; long ll; do { cin>>x; ll = strtol(x,stopstring,10); } while(ll<5);
__________________
---> Lombardp CSS Certified Expert (Master Level) at Experts-Exchange Proud user of LITHIUM forum : CPU technology Webmaster of SEVEN-SEGMENTS : Elettronica per modellismo |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Mi ero scordato della pulizia
![]() Infatti ho provato e credo che la soluzione più semplice sia questa: Codice:
int x; do { while(!(cin >> x)) { cout << "Devi inserire un numero intero" << endl; cin.clear(); //elimino i flag di errore cin.ignore(INT_MAX,'\n'); //ripulisco lo stream } if(x < 5) cout << "Devi inserire un numero intero maggiore di 5" << endl; } while(x < 5); |
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
Grazie mille!!!
solo 2 chiarimenti: 1: Cosa fa cin.ignore(); ? 2: cin.ignore(INT_MAX,'\n'); mi da errore INT_MAX (undeclared identifier) |
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
cin.ignore(INT_MAX,'\n') prende un massimo di INT_MAX caratteri dallo stream fino a quando incrontra \n... Per includere INT_MAX: #include <limits.h> |
|
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
Grande...
Adesso funge tutto! Ancora thanks ![]() |
![]() |
![]() |
![]() |
#15 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
Anche se...
se inserisco valori tipo 7,5 legge il 7 come primo input e il valore di input successivo me lo vede come errore (anche se ancora non l'ho digitato) |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quello è normale...
Non so come tu possa evitarlo... |
![]() |
![]() |
![]() |
#17 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
Se vuoi evitare questi problemi allora usa il secondo metodo che ti ho suggerito. In questo modo leggerai l'intera stringa "7,5" in s e poi verra' tentata la conversione. In ogni caso dallo stream verranno eliminati tutti e tre i caratteri. Occhio pero' che con questo metodo se scrivi due numeri (separati da spazi) sulla stessa linea sara' come inserire due numeri distinti. Se vuoi invece leggere tutta la riga e ignorare tutti cio' che va oltre al primo valore (che sia testuale o numerico) sostiuisci la riga Codice:
cin >> s; Codice:
getline( cin , s ); Cosi' facendo un input del tipo 3 4.34 fdrr verra' considerato valido (valore 3) mentre a3 1 no. Edit: dimenticavo: per utilizzare istringstream ricordati di includere l'header <sstream> (ora correggo anche il codice) |
|
![]() |
![]() |
![]() |
#18 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
Mi da questo errore di compilazione:
Codice:
error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>, class std::allocator<char> >' (or there is no acceptable conversion) Codice:
error C2780: 'class std::basic_istream<_E,_Tr> &__cdecl std::getline(class std::basic_istream<_E,_Tr> &,class std::basic_string<_E,_Tr,_A> &,const _ E)' : expects 3 arguments - 2 provided |
![]() |
![]() |
![]() |
#19 | ||
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Usi il compilatore della Microsoft ?
Quote:
![]() Questo non lo capisco proprio... non esiste l'operatore '>>' per le string !?!?!?!? Quote:
![]() Con getline(cin , s , '\n' ) questo dovrebbe andare. Sinceramente il primo errore e' proprio strano ! L'unica cosa che posso dire e'.... controlla se non ci sono errori di battitura su cin ![]() |
||
![]() |
![]() |
![]() |
#20 |
Member
Iscritto dal: May 2003
Messaggi: 61
|
mi puoi dire dove posso scaricare il compilatore che usi?
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:16.