elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  validacion de datos en C + getch() en windows y linux sin conio
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: validacion de datos en C + getch() en windows y linux sin conio  (Leído 4,136 veces)
bdoX

Desconectado Desconectado

Mensajes: 35



Ver Perfil
validacion de datos en C + getch() en windows y linux sin conio
« en: 17 Enero 2012, 16:11 pm »

Hola a todos:

Voy hacer mi primer aporte en el foro. Se trata de unas funciones que sirven para validar datos de entradas, y unas cuantas macros. Tambien incluye la implementación del getch() que tanto conocemos, en windows y linux.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #ifdef WIN32
  5.    #include <windows.h>
  6.    #define NEWLINE      13
  7.    #define BACKSPACE    8
  8. #else
  9.    #include <termios.h>
  10.    #define NEWLINE      10
  11.    #define BACKSPACE    127
  12. #endif
  13.  
  14. #define TAM              20
  15. #define SPACE            32
  16. #define MIN_NUM          48
  17. #define MAX_NUM          57
  18. #define MIN_LETRA_MAY    65
  19. #define MAX_LETRA_MAY    95
  20. #define MIN_LETRA_MIN    97
  21. #define MAX_LETRA_MIN    122
  22.  
  23. char getch ( );
  24. void validar_letras (char *);
  25. void validar_numeros (int *);
  26.  
  27. int main (void)
  28. {
  29.  
  30.    char buffer[TAM];
  31.    int numero;
  32.  
  33.    printf ( "ingrese una cadena: " );
  34.    validar_letras (buffer);
  35.  
  36.    printf ( "\nla cadena ingresada es: %s\n", buffer );
  37.  
  38.    setbuf (stdin, NULL);
  39.  
  40.    printf ( "Ingrese un numero: " );
  41.    validar_numeros ( &numero );
  42.  
  43.    printf ( "\nEl numero ingresado es: %d\n", numero );
  44.  
  45.    return 0;
  46.  
  47. }
  48.  
  49. void validar_numeros (int *numero)
  50. {
  51.    int i;
  52.    char p[TAM], tecla;
  53.  
  54.    /*importante inicializar los valores
  55.     ya que la implementacion que sigue lo amerita*/
  56.    i = 0;
  57.    p[0] = '\0';
  58.  
  59.    do
  60.    {
  61.        tecla = getch ();//atrapa un caracter sin dejar un eco
  62.  
  63.        /*BACKSPACE es la tecla para eliminar un caracter
  64.         y el i obligaotiamente tiene que ser mayor que cero
  65.         ya que si entra al if y tiene valor cero, el valor de i
  66.         decrementará y p tendría un subindice -1, "p[-1]"¿?*/
  67.        if ( i > 0 && tecla == BACKSPACE )
  68.        {
  69.            printf ( "\b \b" );
  70.            p[--i] = '\0';
  71.        }
  72.        else
  73.        {
  74.            /*rango de numeros y SPACE es el espacio*/
  75.            if ( (tecla >= MIN_NUM && tecla <= MAX_NUM)  ||
  76.                  tecla == SPACE || tecla == '-' )
  77.            {
  78.                /*obligamos a que no hayan mas de un guion, y que
  79.                 el guion este al principio*/
  80.                if ( tecla == '-' && i == 0 )
  81.                {
  82.                    printf ( "%c", tecla );
  83.                    p[i++] = tecla;
  84.                }
  85.                else
  86.                {
  87.                    if ( tecla != '-' )
  88.                    {
  89.                        printf ( "%c", tecla );
  90.                        p[i++] = tecla;
  91.                    }
  92.                }
  93.            }
  94.        }
  95.    } while ((tecla != NEWLINE || p[0] == '\0') && i < TAM);
  96.    /* NEWLINE inidica el Enter, i tiene que ser menor
  97.     que TAM pues de lo contrario, estaría accediendo
  98.     a memoria no reservada*/
  99.    p[i] = '\0'; /*colocamos el fin de cadena*/
  100.    *numero = atoi (p);
  101.    /*convierte una cadena en un numero
  102.     10 quiere decir que está en base decimal*/
  103.  
  104.    return ;
  105. }
  106.  
  107. void validar_letras (char *p)
  108. {
  109.    int i;
  110.    char tecla;
  111.  
  112.    /*importante inicializar los valores
  113.     ya que la implementacion que sigue lo amerita*/
  114.    i = 0;
  115.    p[0] = '\0';
  116.  
  117.    do
  118.    {
  119.        tecla = getch ();//atrapa un caracter sin dejar un eco
  120.  
  121.        /*BACKSPACE es la tecla para eliminar un caracter o de retroceso
  122.         y el i obligaotiamente tiene que ser mayor que cero
  123.         ya que si entra al if y tiene valor cero, el valor de i
  124.         decrementará y p tendría un subindice -1, "p[-1]"¿?*/
  125.        if ( i > 0 && tecla == BACKSPACE )
  126.        {
  127.            printf ( "\b \b" );
  128.            p[--i] = '\0';
  129.        }
  130.        else
  131.        {
  132.            /*rango de letras mayusculas y minusculas y SPACE es el espacio*/
  133.            if ( (tecla >= MIN_LETRA_MAY && tecla <= MAX_LETRA_MAY)  ||
  134.                 (tecla >= MIN_LETRA_MIN && tecla <= MAX_LETRA_MIN)  ||
  135.                  tecla == SPACE )
  136.            {
  137.                printf ( "%c", tecla );
  138.                p[i++] = tecla;
  139.            }
  140.        }
  141.    } while ((tecla != NEWLINE || p[0] == '\0') && i < TAM);
  142.    /* NEWLINE inidica el Enter, i tiene que ser menor
  143.     que TAM pues de lo contrario, estaría accediendo
  144.     a memoria no reservada*/
  145.  
  146.    p[i] = '\0'; /*colocamos el fin de cadena*/
  147.  
  148.    return ;
  149. }
  150.  
  151. #ifdef WIN32
  152.  
  153. char getch ( )
  154. {
  155.    char car;
  156.    DWORD leidos, modo;
  157.  
  158.    GetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), &modo );
  159.    SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo &
  160.                     !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT );
  161.    ReadConsole ( GetStdHandle (STD_INPUT_HANDLE), &car, 1, &leidos, NULL );
  162.    SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo );
  163.    return car;  
  164. }
  165.  
  166. #else
  167.  
  168. char getch ( )
  169. {
  170.  
  171.    struct termios _ter, fuente;
  172.    char car;
  173.  
  174.    if ( tcgetattr (fileno(stdin), &_ter) )
  175.    {
  176.        perror ( "Error para obtener información\n" );
  177.        return -1;
  178.    }
  179.  
  180.    fuente = _ter;
  181.  
  182.    _ter.c_lflag &= ~ICANON;
  183.    _ter.c_lflag &= ~ECHO;
  184.    _ter.c_cc[VMIN] = 1;
  185.    _ter.c_cc[VTIME] = 0;
  186.  
  187.    if ( tcsetattr (fileno(stdin), TCSANOW, &_ter) )
  188.    {
  189.        perror ( " Error para obtener información\n" );
  190.        return -1;
  191.    }
  192.  
  193.    car = getchar ( );
  194.  
  195.    if ( tcsetattr (fileno(stdin), TCSANOW, &fuente) )
  196.    {
  197.        perror ( "Error para obtener información" );
  198.        return -1;
  199.    }
  200.  
  201.    return car;
  202. }
  203. #endif
  204.  
  205.  

ojalá le sirva a alguien.

PD: este code lo publiqué en otro lado, por cualquier cosa.

saludos!





« Última modificación: 20 Enero 2012, 04:13 am por bdoX » En línea

Aleix_1379

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: validacion de datos en C + getch() en windows y linux sin conio
« Respuesta #1 en: 29 Julio 2012, 02:03 am »

Hola, muchas gracias me ha ido genial  ;-)


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: validacion de datos en C + getch() en windows y linux sin conio
« Respuesta #2 en: 29 Julio 2012, 04:19 am »

Salvo programas sencillos no se recomienda el uso de "atoi" ya que esta retorna cero si:
A) La cadena no es valida (por ejemplo "JJJJJ")
B) El numero en la cadena es ... cero.

Para una validación a prueba de errores se debe utilizar la función "strtol" (prototipo en <stdlib.h>).

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
validacion de datos
Programación Visual Basic
tony12 1 1,720 Último mensaje 18 Febrero 2006, 19:08 pm
por zhidow
#include <conio.h> (linux)
Programación C/C++
maxwellnewage 8 15,552 Último mensaje 30 Enero 2019, 15:20 pm
por MAFUS
getch propia para no usar getch de conio
ASM
neo_from_cs_matrix 3 5,447 Último mensaje 24 Agosto 2011, 18:43 pm
por Eternal Idol
getch() y getche() sin conio.h « 1 2 »
Programación C/C++
abreu20011 10 9,719 Último mensaje 27 Octubre 2012, 19:56 pm
por theluigy13etv
Validacion en Base de Datos....
.NET (C#, VB.NET, ASP)
Guillito 2 2,301 Último mensaje 26 Junio 2016, 14:13 pm
por Daniel Barrera
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines