Publi

Desea continuar? [(S)i, (N)o, (M)e lo pienso]

Es común en los programas de consola hacer preguntas al usuario y éste responda, pero sólo una de las opciones válidas, si no, volver a preguntarle hasta que nos diga un valor correcto.

Aquí os enseño un ejemplo sencillo de todo esto (utilizaré la función mygetch):

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
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>

int mygetch(int echo)
{
    struct termios oldt, newt;
    int ch;

    /* Obtenemos atributos del terminal */
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    /* Eliminamos el modo canónico: caracteres especiales */
    newt.c_lflag &= ~ICANON;
    /* Eliminamos el echo a voluntad */
        if (!echo)
            newt.c_lflag &= ~ECHO;
    /* Definimos los nuevos atributos al terminal */
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    /* Ponemos los atributos como estaban al principio */
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}

int get_option(char *texto, char *validas)
{
    int tecla;
    char *ok;
    do
        {
            /* Mostramos texto en pantalla */
            printf("%s: ", texto);
            /* Pedimos una tecla y la pasamos a mayúsculas, para no */
            /* hacer demasiadas comprobaciones luego */
            tecla=toupper(mygetch(1));
            /* strpbrk nos dirá si tecla es una de las válidas */
            ok=strpbrk((char*)&tecla, validas);
            /* strpbrk devuelve NULL si no ha encontrado tecla en validas */
            if (ok==NULL)
                printf("\n¡Opción incorrecta! Por favor seleccione una de estas: %s\n", validas);
        } while (ok==NULL);
    return tecla;
}

int main()
{
    int tecla;

    do
        {
            tecla=get_option("Desea continuar? [(S)i, (N)o, (M)e lo pienso]", "SNM");
            switch (tecla)
                {
                case 'S': printf("\nHas elegido continuar...\n");
                      break;
                case 'N': printf("\nSalir\n");
                      break;
                case 'M': printf("\nTe doy 5 segundos para pensártelo\n");
                      sleep(5);
                      break;
                }
        } while (tecla!='N');
    return 0;
}

Como vemos, sólo tenemos que llamar a la función get_option, pasarle las opciones válidas, y la función sólo nos va a devolver una de las opciones que le digamos.

También podría interesarte...

Only 1 comment left Ir a comentario

  1. Pingback: Bitacoras.com /

Leave a Reply