View Full Version : [C++] Controllare il tipo di input
vendettaaaaa
26-01-2012, 00:24
Ciao,
sto avendo seri dubbi su come controllare che l'input dell'user sia del tipo corretto, in un programma.
Ho creato un programmino che chiede di inserire un intero, ma inserendo un carattere il programma va in loop:
cout << "Element 1 - row "; cin >> n1;
Devo farmi una funzione che scansiona la stringa inserita (perchè l'user può inserire "1" come " 1" come "10" come "10 ") o la soluzione è molto più semplice e io non la so?
Io voglio che se l'user per sbaglio inserisce un non-numero, il programma se ne accorga e riproponga l'inserimento del numero:
do {
cout << "Element 1 - row "; cin >> n1;
} while (isNotAnInteger(n1))
ecco, come realizzo isNotAnInteger() ? :D
clockover
26-01-2012, 01:50
Un carattere corrisponde ad un numero intero quindi pui fare un controllo del tipo if( (c[i] < '0' || c[i] > '9') && c[i] != ' ' )
il verificarsi di questa condizione indica un carattere non numerico. La condizione finale è per quello che richiedevi, cioè la presenza di uno spazio...
ma cosa succede invece se hai "1 0" ??
Infatti sarebbe meglio sapere cosa devi farci con l'input (devi convertirlo in intero?) e cosa fare in situazioni del genere
vendettaaaaa
26-01-2012, 09:53
Un carattere corrisponde ad un numero intero quindi pui fare un controllo del tipo if( (c[i] < '0' || c[i] > '9') && c[i] != ' ' )
Io proprio questo ho fatto, ma non funzionava :mbe:
Alla fine me ne sono uscito con questo:
cout << "Select the difficulty:" << endl;
cout << "1) Easy" << endl;
cout << "2) Medium" << endl;
cout << "3) Hard" << endl;
cout << "4) Custom: choose the grid dimension yourself (max 10x10)" << endl;
cin >> control;
while (!IsInputInteger(control)) {
cout << "You should enter a number between 1 and 4..." << endl;
cout << "1) Easy" << endl;
cout << "2) Medium" << endl;
cout << "3) Hard" << endl;
cout << "4) Custom: choose the grid dimension yourself (max 10x10)" << endl;
cin >> control;
}
difficulty = atoi(control.c_str());
bool IsInputInteger(string& line)
{
for (int i = 0; i < line.size(); ++i) {
if (!isdigit(line[i])) return false;
}
return true;
}
Però mi scoccia dover fare un ciclo for ogni volta sulla stringa di input...cioè, computazionalmente pesa niente sulle CPU odierne ma mi dà l'impressione di esser qualcosa di poco ottimizzato, ma forse mi sbaglio.
Più che altro mi infastidisce il fatto che l'oggetto cin non abbia un controllo del tipo di input:
int n;
cin >> n;
cin dovrebbe accorgersi che sto digitando un carattere, invece no e il programma va in loop...
Credo che creerò una classe derivata da quella di cin aggiungendo varie funzioni di controllo. Qualcuno di voi ha già fatto così, o sa di qualcuno che l'ha fatto, oppure ogni volta aggiungete questi controlli manualmente al vostro programma?
Ciao,
sto avendo seri dubbi su come controllare che l'input dell'user sia del tipo corretto, in un programma.
Ho creato un programmino che chiede di inserire un intero, ma inserendo un carattere il programma va in loop:
cout << "Element 1 - row "; cin >> n1;
Devo farmi una funzione che scansiona la stringa inserita (perchè l'user può inserire "1" come " 1" come "10" come "10 ") o la soluzione è molto più semplice e io non la so?
Io voglio che se l'user per sbaglio inserisce un non-numero, il programma se ne accorga e riproponga l'inserimento del numero:
do {
cout << "Element 1 - row "; cin >> n1;
} while (isNotAnInteger(n1))
ecco, come realizzo isNotAnInteger() ? :D
tipico problema che si incontra le prime volte che programmi in c++
la soluzione è abbastanza semplice
1) non acquisici una stringa ma un intero
2) converti la stringa in intero
una soluzione del genere
se il numero che devi inserire è strettamente positivo o negativo (ovvero l'utente non può inserire zero) la soluzione è semplicissima
cin.getline(strInput,10,'\n');
n=atoi(strInput);
se n=0 l'utente ha inserito un numero non corretto quindi glielo richiedi
char strInput[10];
int n;
do{
cout<<"Inserisci numero: ";
cin.getline(strInput,10,'\n');
cin.ignore(10,'\n');
n=atoi(strInput);
}while (n==0);
atoi è una funzione che converte una stringa in un intero, nel caso la stringa immessa non sia un numero restituisce zero.
nel caso ti serva anche lo zero, controlli la stringa in input
char strInput[10];
int n;
bool err=false;
do{
cout<<"Inserisci numero: ";
cin.getline(strInput,10,'\n');
cin.ignore(10,'\n');
n=atoi(strInput);
if ((n==0)&&(strInput[0]=='0')&&(strInput[1]=='\0'))
err=false;
else
err=true;
}while (err==true);
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.