Tengo un programa en que desde el main se despliega un menu (dentro de un ciclo infinito), para que el usuario pueda elegir la opcion que necesito, yo decidi usar un switch para ir a los submenus, la cosa es que el switch solo acepta numeros enteros, ademas, dentro del while hay un bloque try/catch, por que decidi implementar una forma de lanzar una excepcion cuando detecte el problema y para que el programa no se detenga. La excepcion se envia a una funcion "indentificarExcepcion", que no es nada mas que imprimir por pantalla el tipo de error , por ejemplo, cuando se ingrese mal en el menu, mandara un 1 y al procesar la excepcion, saldra por pantalla "Error: Ingrese caracteres no numericos".
El problema que mas me complica es que si ingreso una letra, pareciera ser que el ciclo while se vuelve loco e imprime el menu infinitas veces, por ahi lei que es necesario usar el clear para restablecer "cin" y tambien usar el flag cin.fail(), pero no tengo los resultados esperados. Les dejo mi codigo.
Código
#include <cstdlib> #include <iostream> #include <windows.h> #include "Operaciones.h" using namespace std; using namespace operaciones; void opcion1(){ cout <<"\e[2J"; cout <<"\n::::: MATRIZ TRASPUESTA :::::\n"; continuar(); } void opcion2(){ cout <<"\e[2J"; cout <<"\n::::: ELIMINAR VALOR :::::\n"; continuar(); } void opcion3(){ cout <<"\e[2J"; cout <<"\n::::: ELIMINAR COLUMNA :::::\n"; continuar(); } void opcion4(){ cout <<"\e[2J"; cout <<"\n::::: ELIMINAR MATRIZ :::::\n"; continuar(); } void opcion5(){ cout <<"\e[2J"; cout <<"\n::::: SUMA ESPECIAL DE UNA MATRIZ :::::\n"; continuar(); } void opcion6(){ cout <<"\e[2J"; cout <<"\n::::: AGREGAR VALOR :::::\n"; continuar(); } void opcion7(){ cout <<"\e[2J"; cout <<"\n::::: INGRESAR NUEVA MATRIZ :::::\n"; continuar(); } void opcion8(){ cout <<"\e[2J"; cout <<"\n::::: TODAS LAS MATRICES DEL SISTEMA :::::\n"; continuar(); } int main(int argc, char** argv) { int opcion; while(true){ desplegarMenu(); try{ cin >> opcion; if(cin.fail()){ cin.clear(); throw 1; } switch(opcion){ case 1: opcion1(); break; case 2: opcion2(); break; case 3: opcion3(); break; case 4: opcion4(); break; case 5: opcion5(); break; case 6: opcion6(); break; case 7: opcion7(); break; case 8: opcion8(); break; case 9: salir(); break; } }catch(int e){ identificarExcepcion(e); } } return 0; }