expresiones regulares para validacion

Iniciado por phantom, 22 Enero 2008, 06:07 AM

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

phantom

buenas tengo una pequeña duda:
se podrían usar las expresiones regulares para asi validar la entrada de un carácter :huh:
ej:
   printf("introduzca la letra de identificador E-Empleado, C-Cliente, P-Producto");
   scanf("%[ECP]",&letra);
así lo que consigo es que solo me admita E C y P la cuestión es que cuando no es ninguno de los casos me reconoce basura y quisiera saber si hay alguna forma de ver si esta esa basura en la variable para que asi de ser el caso de que este la basura mostrar un mensaje diciendo a introducido la letra mal vuelva a introducirla
gracias de antemano :P

Flakito81

Se me ocurre algo como esto:


do
   repetir = 0;
   scanf(.....);
   if (letra!= 'E' && letra != 'P' && letra != 'C')
   {
      repetir = 1;
      printf (" es basura");
   }
while (repetir);



Suerte!

phantom

mm intento poner pa validarlo y si no es correcto el dato que lo vuelva a pedir pero esque me hace un fantastico y divertido bucle infinito :( alguna idea



#include <stdio.h>
#include <string.h>
int main ()
{
char letra='o';
int repetir;
printf("introduzca la letra de identificador E-Empleado, C-Cliente, P-Producto\n");
scanf("%[ECP]",&letra);
do
{
repetir=0;
do
{
scanf("%[ECP]",&letra);
repetir=1;
}while(letra!='E' || letra !='p' || letra!='C');
}while(repetir=0);
printf("%c",letra);
getch();
return(1);}

Flakito81

Ya el post está respondido:


do
   repetir = 0;
   printf("introduzca la letra de identificador E-Empleado, C-Cliente, P-Producto\n");
   scanf("%[ECP]",&letra);
   if (letra!= 'E' && letra != 'P' && letra != 'C')
   {
      repetir = 1;
      printf (" Teclea un dato correcto");
   }
while (repetir);  // o while (repetir == 1)


PD: fíjate mejor en el código y haz alguna traza de forma mental.

Suerte!

Ragnarok

Flakito81 para hacer luego todos los ifs no hace falta que se curre las expresiones regulares en scanf, que dicho sea de paso, se ven poco por el foro y se agradece.

phantom
¿seguro que te reconoce basura? ¿no tendrás la basura de antes?

He estado buscando información, pero las opciones de scanf y printf son de esas cosas que a nadie le apetece documentar, por ejemplo en conclase.net no se menciona.

No olvidéis leer las normas generales, además de las específicas de cada tablón.sgae, ladrones

cassiani

¡Hola phantom! no se si ya habéis solucionado tu problema, de todas formas igual aporto algo que tal vez os ayude ahora o mas adelante: 

}while(letra!='E' || letra !='p' || letra!='C');
En esta línea de tu code tienes un error lógico debido a que le estas diciendo que se repita mientras se cumpla UNA de las tres condiciones y deberían ser las TRES para que sea efectivo, en ese sentido deberíais cambiar el '||' por '&&', además basta con usar un solo ciclo.

Tu code modificado quedaría así:
int main ()
{
char letra='o';
int repetir;
do
{
clrscr();
printf("introduzca la letra de identificador E-Empleado, C-Cliente, P-Producto\n");
scanf("%c",&letra);
}while(letra!='E' && letra !='P' && letra!='C');

printf("Letra --> %c",letra);
getch();
}


Acá otra forma de hacer lo mismo:
#include <stdio.h>
#include<conio.h>
char Letra;
int main()
{
Repetir:;
clrscr();
printf("introduzca la letra de identificador E-Empleado, C-Cliente, P-Producto\n");
scanf("%c",&Letra);
        if ((Letra!='P') && (Letra!='C') && (Letra!='E'))
{
printf("\n\n­lee antes de introducir el caracter! ­os dije C, P o E!");
getchar();getchar();
goto Repetir;//Repetir mientras no sea correcta la entrada
}
        clrscr();
printf("La letra de entrada es %c",Letra);
getchar();getchar();
}


Espero que aun os pueda servir, ¡S4lu2!

Rzone44

Creo que solo les falta liberar memoria.


#include <stdio.h>
#include <string.h>
int main ()
{
char letra='o';
int repetir;
do
  {
   repetir = 0;
   printf("introduzca la letra de identificador E-Empleado, C-Cliente, P-Producto\n");
  fflush(stdin);
   scanf("%[ECP]",&letra);
   if (letra!= 'E' && letra != 'P' && letra != 'C')
   {
      repetir = 1;
      printf (" Teclea un dato correcto");
   }
  }
while (repetir);  // o while (repetir == 1)
printf("%c",letra);
getch();
return(1);}

leogtz

fflush(stdin) tiene un comportamiento indefinido, por tanto no se debe de usar, ya se ha hablado de ello muchas veces.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com