|
|||||||
|
|
|
![]() |
|
|
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: 03:25.



















