Originariamente inviato da Dora
Sono ritornata!
Questa volta il mio problema riguarda le conversioni di tipo. Io ho un programma che mi richiede alla console dei numeri. Se inserisco un numero da 1 a 20, il programma mi deve disegnare il perimetro di un quadrato, formato da tanti asterischi per lato in base al numero che ho inserito (ma questo è un problema che cercherò di risolvere da sola). Se scrivo -1, il programma si interrompe, se scrivo un numero non compreso tra 1 e 20, che è diverso da -1, il programma deve visualizzare il messaggio "Misura non valida...", ma se scrivessi una lettera? Mi va in tilt tutto!
In C, scrivevo:
codice:
if(variabile <= "47" && variabile >= "58"){printf("Carattere non valido! Inserire un numero!");}
Non so come facesse a funzionare, indipendentemente dal tipo di variabile un confronto di quel genere non ha alcun senso. L'unico caso in cui potrebbe aver senso è se variabile è un singolo char e 47 e 58 sono scritti senza le virgolette.
Ma in C++, la conversione da un numero ad un carattere non è possibile... come faccio?
La conversione da numero a carattere è possibile ma non c'entra niente. Il fatto qui è che l'operatore di estrazione (>>) cerca di convertire i dati inseriti in numero e non ci riesce, e li lascia nel buffer di input; visto che l'operazione è in un ciclo infinito il programma "impazzisce". Non ha senso cercare di controllare i caratteri inseriti convertendo lato in un char: non puoi ottenere direttamente i caratteri inseriti proprio perché ne hai delegato all'operatore >> il lavoro di conversione.
Di solito in queste circostanze per acquisire input numerici o altri input che potrebbero dare problemi di caratteri non accettati utilizzo questa funzioncina:
codice:
#include <limits>
//...
template<class inType> void AcquireInput(std::ostream & Os, std::istream & Is, const char * Prompt, const char * ErrorMessage, inType & Result)
{
do
{
Os<<Prompt;
if(Is.fail())
{
Os<<ErrorMessage;
Is.clear();
Is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
Is>>Result;
} while(Is.fail());
}
da impiegare in questa maniera:
codice:
AcquireInput(cout, cin, "Inserire la misura del lato del quadrato da 1 a 20 (-1 per uscire): ", "Carattere non valido.\n", lato);
P.S: Nel precedente problema, "secondlargest = largest" può essere rimosso: ho controllato.
Non ne sarei così sicuro...