Dev - C++ - Pequeño problema, seguramente con el buffer

 
Vista:
sin imagen de perfil
Val: 6
Ha disminuido su posición en 6 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pequeño problema, seguramente con el buffer

Publicado por Misael (3 intervenciones) el 21/01/2020 12:44:09
Buenas, tengo un pequeño problema con esta parte el código de mi programa...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int menu_principal() //Menu Principal
{
 int opcion;
	do
	{
		cout<<"1. English ---> Spanish"<<endl;
		cout<<"2. Spanish ---> English"<<endl;
		cout<<"3. Exit"<<endl<<endl;
		cout<<"Option: "; cin>>opcion;
		verificar_opcion(opcion);
	}while(flag=1);
 
	return opcion;
}
 
template <class TIPOD>
int verificar_opcion(TIPOD& option)
{
	if(option!=1 && option!=2 && option!=3)
	{
		system("cls"); option=0;
		cout<<"\aError. Digite una opcion correspondiente. "<<endl<<endl; system("pause");
		 system("cls");fflush(stdin);
	}
	else
	{
		flag=0;
	}
}
Lo que pasa ese que cuando digito por ejemplo una "a" y se almacena en "opcion" como que el buffer se llena y saltea el "cin>>opcion;". Intente usando fflush(stdin) y cin.ignore() pero no resulto, tambien intenté cambiando el valor de opcion, en la funcion verificar_opcion (usando la posicion de memoria). Si alguien puede ayudarme estaría genial. Ya me paso antes esto y justamente en este mismo programa pero lo deje porque aun no sabia usar funciones y se me hacia muy desordenado todo, crei que lo podria solucionar pero aun no puedo. Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pequeño problema, seguramente con el buffer

Publicado por Rodrigo (539 intervenciones) el 21/01/2020 17:39:30
No se si tienes ademas de lo que dices otro problema, o esto es lo q te pasa:
En la linea 11 hay una asignacion, no una comparacion.
Es lo que quieres?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 6
Ha disminuido su posición en 6 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pequeño problema, seguramente con el buffer

Publicado por Misael (3 intervenciones) el 21/01/2020 21:18:40
Tienes razón, acabo de arreglar esa linea de codigo, pero aun asi el problema persiste... Alguna otra idea...?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pequeño problema, seguramente con el buffer

Publicado por Alfil (1444 intervenciones) el 22/01/2020 08:12:06
Prueba a realizar el menú siguiendo este esquema. Al utilizar un char en lugar de un int como opción, solucionas el problema de que se pulse una letra en vez de un número.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
 
using namespace std;
 
void menu();
 
int main ()
{
    char opcion;
 
    do{
        menu();
        cin >> opcion;
 
        switch(opcion) {
            case '1':
                break;
 
            case '2':
                break;
 
            case '3':
                cout << "\nFIN DEL PROGRAMA" << endl;
                break;
 
            default:
                cout << "\nOPCION NO VALIDA" << endl;
                break;
        }
 
    }while(opcion != '3');
 
    cout << endl;
 
    return 0;
}
 
void menu()
{
    cout << "\n   SEGUROS CARONI"
         << "\n========================"
         << "\n1.- Plan A ....... [ 1 ]"
         << "\n2.- Plan B ....... [ 2 ]"
         << "\n3.- Terminar ..... [ 3 ]"
         << "\n========================"
         << "\nOPCION (1 - 3): ";
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 6
Ha disminuido su posición en 6 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pequeño problema, seguramente con el buffer

Publicado por Misael (3 intervenciones) el 22/01/2020 13:13:48
Encontre el problema, pero para los conocimientos que yo tengo es dificil de solucionar... Va de que cuando ingresas un caracter en una variable tipo int, se activan unos flags en el buffer que no te permiten ingresar datos, para eso hay que poner los flags a su estado anterior, primero usando cin.clear y despues cin.ignore, hasta ahi todo solucionado, pero si en vez de insertar un caracter ingreso una palabra, el problema vuelve, lei que tenias que poner limites en cin.ignore(limits) o algo asi pero la verdad, busque y busque pero no encontre como hacerlo. De todas maneras agradezco tu aporte lo probaré
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Alfil
Val: 4.344
Oro
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pequeño problema, seguramente con el buffer

Publicado por Alfil (1444 intervenciones) el 22/01/2020 18:04:45
Un ejemplo del manejo de estados de error de flujo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
using namespace std;
 
int main()
{
    int numero;
 
    do{
        if( cin.fail() || cin.bad() ){
            cin.clear();
            cin.ignore(80, '\n');
            cout << "\nDebe introducir un numero\n";
        }
 
        cout << "\nIntroduce un numero: "; cin >> numero;
 
    } while( cin.fail() || cin.bad() );
 
    cout << "\nEl numero introducido es " << numero << endl;
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Pequeño problema, seguramente con el buffer

Publicado por Thanatos (199 intervenciones) el 22/01/2020 20:50:42
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>  // cout, cin, streamsize, streambuf
#include <limits>    // numeric_limits<>
 
using namespace std;
 
void mostrarMenu();
int leerOpcion();
 
int main () {
    int opcion = 0;
 
    while (opcion != 3) {
        mostrarMenu();
        opcion = leerOpcion();
 
        switch (opcion) {
            case 1:
                cout << "\n* Opcion A ejecutada *\n";
                break;
            case 2:
                cout << "\n* Opcion B ejecutada *\n";
                break;
            case 3:
                cout << "\n* Fin del programa *\n";
                break;
            default:
                cout << "\n* Esa opcion no existe *\n";
                break;
        }
        cout << '\n';
    }
 
    return 0;
}
 
void mostrarMenu() {
    cout << "------------------ \n"
         << " MENU DE OPCIONES  \n"
         << "------------------ \n"
         << "   1. Opcion A     \n"
         << "   2. Opcion B     \n"
         << "   3. Salir        \n"
         << "------------------ \n"
         << " opcion: ";
}
 
int leerOpcion() {
    streambuf *buffer;
    int opcion;
 
    cin >> opcion;
 
    // "buffer" apunta al contenido restante del "stream" de entrada.
    buffer = cin.rdbuf();
 
    // Si ha ocurrido un error relacionado con el "stream" de
    // entrada de datos o aún queda algún contenido en él....
    if (cin.fail() || buffer) {
        // Modifica los indicadores (flags) de estado, asignándoles
        // un estado válido.
        cin.clear(),
 
        // Ignora (extrae y descarta) los caracteres que aún quedan
        // en el "stream" de entrada. Realiza esta operación hasta
        // llegar al final del "stream" o hasta encontrar el carácter
        // que actúa como delimitador, en este caso: '\n'.
        (void) cin.ignore(numeric_limits<streamsize>::max(), '\n');
    }
 
    return opcion;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar