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:
Tuttavia, se lo collego al resto del programma, riscontro problemi: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); }
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".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'); }
Dove risiede questa "incompatibilità"?

Rispondi quotando
