Buongiorno a tutti,
ho scritto questo codice di controllo input che, se testato a parte fa egregiamente il suo dovere per le finalità con cui è stato concepito:
codice:
#include <string>
#include <typeinfo>
#include <iostream>
int ReadStr (std::string ins){
std::locale loc;
bool numb=true;
for(int i=0; i<ins.length(); i++){
numb = numb && (isdigit(ins[i],loc));
}
if(numb == true){return 0;}
if(ins.length() == 1){return 1;}
return 2;
}
template <typename T>
void Inserimento (T ins){
int a, b;
do{
std::string str;
std::cin.clear();
std::getline(std::cin, str);
if(typeid(ins) == typeid(int)){a = 0;}
else if(typeid(ins) == typeid(char)){a = 1;}
else {a = 2;}
b = ReadStr(str);
if (a != b){
std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata: ";
}
}while (a != b);
}
Tuttavia, se lo collego al resto del programma, riscontro problemi:
codice:
do{
std::cout<<"\n\n\u2022 Visualizza Catalogo (C)\n\u2022 Effettua un Ordine (O)\n\u2022 Visualizza il Carrello (B)\n\u2022 Rimuovi un prodotto dal carrello (R)\n\u2022 Termina e paga - Esci (Q)\n";
std::cout<<"\nScelta selezionata: ";
char c;
Inserimento(c); // Leggo input utente
switch(c) { //Switch per i diversi casi
case 'C' : //Catalogo
case 'c' :
Catalogo.print();
break;
case 'O' : // Ordine
case 'o' :
ordine(Catalogo, Carrello);
break;
case 'B' : //Carrello
case 'b' :
std::cout<<"\n";
Carrello.print();
break;
case 'R' : //Rimovi
case 'r' :
std::cout<<"\n";
remove(Catalogo,Carrello);
break;
case 'Q' : //quit
case 'q' :
std::cout<<"\n\nGrazie per aver scelto Grandi Magazzini PPP \nArrivederci al prossimo acquisto!\n\n";
return;
default : //In ogni altro caso
std::cout<<"L'inserimento non è valido\n";
while (std::cin.get() != '\n') // pulisco il cin
{
continue;
}
// menu(Catalogo, Carrello);
}
}while('c' == 'q' || 'Q');
}
Infatti, pur inserendo 'c' o le altre lettere disponibili nell'indice, questa non viene riconosciuta come tale e lo switch ricade sempre nel case "default".
Dove risiede questa "incompatibilità"?