View Full Version : [c++] controllo input
Ciao a tutti
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAX_FIUMI = 300;
const int MAX_CITTA = 100;
int FiumiCitta [MAX_FIUMI] [MAX_CITTA] ;
void CaricaPerFiume (int FiumiCitta [MAX_FIUMI] [MAX_CITTA],
int n_fiumi, int n_citta)
{
for (int fiumi=0; fiumi<n_fiumi; fiumi++)
for (int citta=0; citta<n_citta; citta++)
{
do
{
cout <<endl <<" Inserire 1 se il fiume " <<fiumi +1<<
" bagna la citta " <<citta +1 << " ,0 se non la bagna ";
cin >>FiumiCitta [fiumi] [citta]; cout <<endl;
if (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1)
cout <<" Errore inserire 1 o 0" <<endl;
}
while (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1);
In questa funzione vorrei avere il controllo dell input da tastiera se inserisco dei numeri che non sono 1 o 0 mi da errore e ripete il ciclo tutto bene,ma se inserisco una lettera il programma va in loop.....
TNX a tutti
riporta un esempio completo, incluso il main e un esempio di input per la tua funzione .
vendettaaaaa
01-09-2014, 18:30
Tempo fa avevo pensato un po' a come fare, ma non ricordo la soluzione che avevo scelto. A pensarci un po' sbrigativamente, e contando che non tocco il C++ da un po', ho tirato fuori questo:
#include <iostream>
#include <string>
using namespace std;
int read_int_from_console()
{
READ:
string in;
cin >> in;
try
{
return stoi(in); // stoi converte una string ad int; se non riesce, lancia eccezione
}
catch (exception ex)
{
cout << "string " << in << " couldn't be cast to int!!" << endl << endl;
goto READ;
}
}
int main()
{
cout << "Enter an integer number." << endl;
int n = read_int_from_console();
cout << "You entered: " << n << endl << endl;
return 0;
}
Premesso che ti serve un compilatore abbastanza aggiornato (gcc 4.7 o più nuovo, mingw 4.7 o più nuovo, Visual Studio 2012 o più nuovo) per poter usare la funzione stoi, l'idea è leggere una stringa e tentare la conversione ad intero, intercettando le eccezioni che farebbero partire il loop.
Problema: se scrivi 12asdas in console, ti viene restituito 12 anzichè dare errore. Soluzione: pensaci tu, questa risposta è solo un suggerimento sulla strada da percorrere :D
Silvia2003
02-09-2014, 08:47
Nel caso suggerirei questa variante che evita il 'GOTO'.
int read_int_from_console() {
int ret;
string in;
bool loop = false;
while(!loop) {
cin >> in;
try {
ret = stoi(in);
loop = true;
}
catch (exception ex) {
cerr << "Error!" << endl;
}
}
return ret;
}
Grazie a tutti per le risposte questo è l 'intero codice
#include <cstdlib>
#include <iostream>
using namespace std;
const int MAX_FIUMI = 300;
const int MAX_CITTA = 100;
int FiumiCitta [MAX_FIUMI] [MAX_CITTA] ;
void CaricaPerFiume (int FiumiCitta [MAX_FIUMI] [MAX_CITTA],
int n_fiumi, int n_citta)
{
for (int fiumi=0; fiumi<n_fiumi; fiumi++)
for (int citta=0; citta<n_citta; citta++)
{
do
{
cout <<endl <<" Inserire 1 se il fiume " <<fiumi +1<<
" bagna la citta " <<citta +1 << " ,0 se non la bagna ";
cin >>FiumiCitta [fiumi] [citta]; cout <<endl;
if (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1)
cout <<" Errore inserire 1 o 0" <<endl;
}
while (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1);
}
}
void StampaPerFiume (int FiumiCitta [MAX_FIUMI] [MAX_CITTA],
int n_fiumi, int n_citta)
{
for (int fiumi=0; fiumi<n_fiumi; fiumi++)
{
cout << endl << "Situazione per il fiume" <<fiumi +1 <<": ";
for (int citta=0; citta<n_citta; citta++)
cout <<FiumiCitta [fiumi] [citta];
}
}
void CaricaPerCitta (int FiumiCitta [MAX_FIUMI] [MAX_CITTA],
int n_fiumi, int n_citta)
{
for (int citta=0; citta<n_citta; citta++)
for (int fiumi=0; fiumi<n_fiumi; fiumi++)
{
cout <<endl <<" Inserire 1 se la citta " <<citta +1<<
" e' bagnata dal fiume " <<citta +1 << " ,0 se non e' bagnata ";
cin >>FiumiCitta [fiumi] [citta];
}
}
int main(int argc, char *argv[])
{
CaricaPerFiume (FiumiCitta,3,2);
//CaricaPerCitta (FiumiCitta,3,2);
//StampaPerFiume (FiumiCitta,3,2);
cout <<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
da neofita pensavo che il seguente codice
do
{
cout <<endl <<" Inserire 1 se il fiume " <<fiumi +1<<
" bagna la citta " <<citta +1 << " ,0 se non la bagna ";
cin >>FiumiCitta [fiumi] [citta]; cout <<endl;
if (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1)
cout <<" Errore inserire 1 o 0" <<endl;
}
while (FiumiCitta[fiumi] [citta] != 0 && FiumiCitta[fiumi] [citta] != 1);
avrebbe risolto il problema anche con simboli ,lettere......proverò vostre soluzioni
TNX A TUTTI
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.