validar texto y numero!! Turbo c++

Iniciado por kriz145, 16 Enero 2012, 05:43 AM

0 Miembros y 1 Visitante están viendo este tema.

kriz145

Buenas noches

tengo un problema, necesito validar numeros y letras: esto es lo que llevo

#include <stdio.h>
#include <ctype.h>
#include <conio.h>

char *nom;
char *num;

main()
{
clrscr();
printf("ingrese nombre:");
gets(nom);
while(*nom)
{
if (isalpha(*nom)) printf("%c",*nom);
else printf("ERROR");
nom++;

}
getch();

clrscr();
printf("ingrese edad:");
gets(num);
while(*num)
{
if (isdigit(*num)) printf("%c",*num);
else printf("ERROR");
num++;

}
getch();
}

pero por ejemplo, quiero que si pido edad y pongo letras me marcara error, quiero que regrese y me lo vuelva a pedir hasta que ponga numero... no se si me explique bien =(. chao!!

rir3760

El programa tal como esta no funcionara correctamente por varios errores críticos.

No quiero sonar como un [CENSORED] de lo mas pedante pero creo que acabas de romper todas (o casi todas) las recomendaciones del tema |Lo que no hay que hacer en C/C++. Nivel basico|. Espero no lo tomes a mal (solo es un comentario con humor).

Lo primero (si es posible) es cambiar de compilador por uno mas reciente y actualizado, recomendaciones hay muchas, solo tienes que usar el motor de búsqueda de los foros.

En cuanto al programa los errores mas importantes son utilizar las variables "nom" y "num" sin antes asignarles un valor (la dirección en memoria retornada por malloc, calloc o realloc). Al no hacerlo el valor inicial de ambas variables es NULL.

En cuanto a los bucles una forma mejor es verificar cada carácter. Aquí tienes el problema del espacio blanco antes y después de un numero así como el espacio intercalado en nombres compuestos como "Jose Maria".

Bueno, comparas cada carácter y si es valido continuas. Con ello al terminar el bucle basta con revisar si el ultimo carácter procesado es el '\0'. Si es así la cadena es valida.

Poco mas o poco menos (para el nombre):
for (i = 0; isalpha(nom[i]) || isspace(nom[i]); i++)
   ;
if (nom[i] == '\0'){
   /* La cadena es valida */
}else {
   /* No lo es */
}


Un saludo
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

bdoX

#2
Una manera de validar bien mis entradas de datos,  y que me gusta muchisimo, es:


#include <stdio.h>
#include <windows.h>

#define TAM 10

void validar_letras (char *p);
char getch ( );

int main ()
{
   char buffer[TAM];
   
   printf ( "ingrese cadena: " );
   validar_letras (buffer);
   
   printf ( "\n%s", buffer );
   
   setbuf (stdin, NULL);
   getchar ();
   return 0;
}

void validar_letras (char *p)
{
   int i;
   char tecla;
   
   /*importante inicializar los valores
   ya que la implementacion que hice lo amerita*/
   i = 0;
   p[0] = '\0';
   
   do
   {
       tecla = getch ();//atrapa un caracter sin dejar un eco
       
       /*8 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 == 8 )
       {
           printf ( "\b \b" );
           p[--i] = '\0';
       }
       else
       {
           /*rango de letras mayusculas y minusculas y 32 es el espacio*/
           if ( (tecla >= 65 && tecla <= 95)  ||
                (tecla >= 97 && tecla <= 122) ||
                 tecla == 32 )
           {
               printf ( "%c", tecla );
               p[i++] = tecla;
           }
       }
   } while ((tecla != 13 || p[0] == '\0') && i < TAM);
   /* 13 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 ;
}

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;  
}


Para que decir con los numeros, es lo mismo.

saludOS!