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!!
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| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html). 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
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!