View Single Post
Old 03-06-2007, 15:05   #5
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da uomoserio Guarda i messaggi
Ciao a tutti, avrei bisogno di qualche
Domanda 1: nella funzione insNumero(), ho usato un metodo spicciolo per controllare che il valore immesso sia compreso fra 1 e 100, così se l'utente immette dei caratteri invece di numeri il controllo comunque lo blocca (altrimenti il programma si impalla di brutto!). Ma se io avessi voluto verificare a priori il tipo immesso dall'utente (caratteri o numeri) come dovevo fare?
Se vuoi usare gli stream del C++, puoi fare qualcosa di simile al seguente:
Codice:
#include <iostream>
using namespace std;

/* ... */
int n;
cin >> n
if ( cin.fail() ) // ho inserito dei caratteri
{
  cin.clear();
  while( !isdigit( cin.peek() ) ) cin.ignore();
}
Questo fa si' che in caso di errore vengano ignorati tutti i caratteri fino alla prima cifra.
Se preferisci che venga ignorata tutta la riga, allora puoi fare nel modo seguente
Codice:
#include <iostream>
using namespace std;

/* ... */
int n;
cin >> n
if ( cin.fail() ) // ho inserito dei caratteri
{
  cin.clear();
  while( cin.peek() != '\n' ) cin.ignore();
}
Vedi tu quale sia piu' adatto al tuo caso

Quote:
Domanda 2: per evitare i soliti problemi con i caratteri rimanenti nel buffer di immissione, dopo ogni inserimento da parte dell'utente ho usato fflush(stdin) per svuotare il buffer ed evitare che all'immisione successiva venissero presi eventuali caratteri residui. Questo è un sistema corretto? Oppure esiste un sistema migliore per controllare l'eccedenza del buffer di stdin? Inoltre la funzione fflush(stdin) l'ho trovata cercando nei forum....ma possibile che nessun manuale di C/C++, fra le decine che possiedo, si degni di spiegare queste cose? Eppure il problema della ingestibilità del buffer di input è un problema molto diffuso, a quanto leggo in giro....
No, flush va bene solo con l'output. Se anche funzionasse (ovvero svuotando il buffer di input) non puoi avere la certezza che questo contenga una sola linea di testo

Quote:
Domanda 3: per ora il programma è scritto in C, usando le funzioni standard printf e scanf. Ma se io avessi voluto rimanere sul C++ e usare cin per le immissioni dell'utente, in che modo si utilizza esattamente? So che la forma generale con l'operatore estrattore è "cin >> variabile", ma in che modo posso formattare l'input (come ad esempio"%u" in scanf) per essere sicuro che mi restituisca un valore e non un carattere?
Nel tuo caso, vedi la prima riga: basta usare una variabile del tipo opportuno, ven,tuali input non previsti settano lo stato del canale su "fail". In generale non puoi formattare l'input allo stesso modo in cui usi una scanf, ci si puo' arrivare vicino leggendo l'input in variabili del tipo opportuno, ed ignorando i caratteri che non ti interessano.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele

Ultima modifica di marco.r : 03-06-2007 alle 15:06. Motivo: tag sbagliati...
marco.r è offline   Rispondi citando il messaggio o parte di esso