elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 21:26  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  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 251 veces)
bdoX

Desconectado Desconectado

Mensajes: 31



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

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
#include <stdio.h>
#include <stdlib.h>
 
#ifdef WIN32
   #include <windows.h>
   #define NEWLINE      13
   #define BACKSPACE    8
#else
   #include <termios.h>
   #define NEWLINE      10
   #define BACKSPACE    127
#endif
 
#define TAM              20
#define SPACE            32
#define MIN_NUM          48
#define MAX_NUM          57
#define MIN_LETRA_MAY    65
#define MAX_LETRA_MAY    95
#define MIN_LETRA_MIN    97
#define MAX_LETRA_MIN    122
 
char getch ( );
void validar_letras (char *);
void validar_numeros (int *);
 
int main (void)
{
 
   char buffer[TAM];
   int numero;
 
   printf ( "ingrese una cadena: " );
   validar_letras (buffer);
 
   printf ( "\nla cadena ingresada es: %s\n", buffer );
 
   setbuf (stdin, NULL);
 
   printf ( "Ingrese un numero: " );
   validar_numeros ( &numero );
 
   printf ( "\nEl numero ingresado es: %d\n", numero );
 
   return 0;
 
}
 
void validar_numeros (int *numero)
{
   int i;
   char p[TAM], tecla;
 
   /*importante inicializar los valores
   ya que la implementacion que sigue lo amerita*/

   i = 0;
   p[0] = '\0';
 
   do
   {
       tecla = getch ();//atrapa un caracter sin dejar un eco
 
       /*BACKSPACE es la tecla para eliminar un caracter
       y el i obligaotiamente tiene que ser mayor que cero
       ya que si entra al if y tiene valor cero, el valor de i
       decrementará y p tendría un subindice -1, "p[-1]"¿?*/

       if ( i > 0 && tecla == BACKSPACE )
       {
           printf ( "\b \b" );
           p[--i] = '\0';
       }
       else
       {
           /*rango de numeros y SPACE es el espacio*/
           if ( (tecla >= MIN_NUM && tecla <= MAX_NUM)  ||
                 tecla == SPACE || tecla == '-' )
           {
               /*obligamos a que no hayan mas de un guion, y que
               el guion este al principio*/

               if ( tecla == '-' && i == 0 )
               {
                   printf ( "%c", tecla );
                   p[i++] = tecla;
               }
               else
               {
                   if ( tecla != '-' )
                   {
                       printf ( "%c", tecla );
                       p[i++] = tecla;
                   }
               }
           }
       }
   } while ((tecla != NEWLINE || p[0] == '\0') && i < TAM);
   /* NEWLINE inidica el Enter, i tiene que ser menor
   que TAM pues de lo contrario, estaría accediendo
   a memoria no reservada*/

   p[i] = '\0'; /*colocamos el fin de cadena*/
   *numero = atoi (p);
   /*convierte una cadena en un numero
   10 quiere decir que está en base decimal*/

 
   return ;
}
 
void validar_letras (char *p)
{
   int i;
   char tecla;
 
   /*importante inicializar los valores
   ya que la implementacion que sigue lo amerita*/

   i = 0;
   p[0] = '\0';
 
   do
   {
       tecla = getch ();//atrapa un caracter sin dejar un eco
 
       /*BACKSPACE es la tecla para eliminar un caracter o de retroceso
       y el i obligaotiamente tiene que ser mayor que cero
       ya que si entra al if y tiene valor cero, el valor de i
       decrementará y p tendría un subindice -1, "p[-1]"¿?*/

       if ( i > 0 && tecla == BACKSPACE )
       {
           printf ( "\b \b" );
           p[--i] = '\0';
       }
       else
       {
           /*rango de letras mayusculas y minusculas y SPACE es el espacio*/
           if ( (tecla >= MIN_LETRA_MAY && tecla <= MAX_LETRA_MAY)  ||
                (tecla >= MIN_LETRA_MIN && tecla <= MAX_LETRA_MIN)  ||
                 tecla == SPACE )
           {
               printf ( "%c", tecla );
               p[i++] = tecla;
           }
       }
   } while ((tecla != NEWLINE || p[0] == '\0') && i < TAM);
   /* NEWLINE inidica el Enter, i tiene que ser menor
   que TAM pues de lo contrario, estaría accediendo
   a memoria no reservada*/

 
   p[i] = '\0'; /*colocamos el fin de cadena*/
 
   return ;
}
 
#ifdef WIN32
 
char getch ( )
{
   char car;
   DWORD leidos, modo;
 
   GetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), &modo );
   SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo &
                    !ENABLE_ECHO_INPUT & !ENABLE_PROCESSED_INPUT );
   ReadConsole ( GetStdHandle (STD_INPUT_HANDLE), &car, 1, &leidos, NULL );
   SetConsoleMode ( GetStdHandle (STD_INPUT_HANDLE), modo );
   return car;  
}
 
#else
 
char getch ( )
{
 
   struct termios _ter, fuente;
   char car;
 
   if ( tcgetattr (fileno(stdin), &_ter) )
   {
       perror ( "Error para obtener información\n" );
       return -1;
   }
 
   fuente = _ter;
 
   _ter.c_lflag &= ~ICANON;
   _ter.c_lflag &= ~ECHO;
   _ter.c_cc[VMIN] = 1;
   _ter.c_cc[VTIME] = 0;
 
   if ( tcsetattr (fileno(stdin), TCSANOW, &_ter) )
   {
       perror ( " Error para obtener información\n" );
       return -1;
   }
 
   car = getchar ( );
 
   if ( tcsetattr (fileno(stdin), TCSANOW, &fuente) )
   {
       perror ( "Error para obtener información" );
       return -1;
   }
 
   return car;
}
#endif
 
 

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 por bdoX » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
VIOLACIÓN DE SEGMENTO usando GETCH() C++ Linux
Programación C/C++
<<The Joker>> 1 2,018 Último mensaje 23 Junio 2005, 23:54
por <<The Joker>>
no puedo hacer funcionar getch en linux
Programación C/C++
Proxy Lainux 14 4,889 Último mensaje 15 Mayo 2008, 08:46
por Proxy Lainux
contraseña--- sin usar getch() ni conio...
Programación C/C++
PsyAcCes 14 4,031 Último mensaje 2 Agosto 2008, 07:37
por BEATMASTER
getch() en Linux [Solucionado]
Programación C/C++
nap-buf 4 1,964 Último mensaje 25 Marzo 2010, 21:22
por nap-buf
getch propia para no usar getch de conio
ASM
neo_from_cs_matrix 3 1,682 Último mensaje 24 Agosto 2011, 18:43
por Eternal Idol
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines