elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
18 Noviembre 2008, 11:12  



+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++
| | |-+  validador hecho en c, conpila pero no funciona
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Imprimir
Autor Tema: validador hecho en c, conpila pero no funciona  (Leído 320 veces)
Kr3c13nt3

Desconectado Desconectado

Mensajes: 15


Ver Perfil
validador hecho en c, conpila pero no funciona
« en: 02 Septiembre 2008, 13:53 »

Holas:

hace milenios, que no he venido por aqui pero aki estoy. :rolleyes:. Aqui tengo en código C, un validador...el problema es que le ingreso solo digitos y aparece el mensaje de error. Busco saber porque dice error...y me aparece un signo de exclamación por pantalla, sin averlo invocado antes!!!!! :o. Si encuentran algún error, por favor, háganlo saber

Hecho con dev-c++ 4.9.9.2
Entorno window$.

Código:
#include <string.h>
#include <stdio.h>
#include <ctype.h>

/**Este metodo valida si el rut ingresado son solo numeros */
int main(){
/**He aqui la variable rut en formato char para hacer corroboraciones*/
char rut[7];
int i=0;

printf("Ingrese RUT: ");
scanf("%s", &rut[7]);
/*Para validar esto se ocupa la funcion isdigit*/

while(rut[i]!=7) {
if( isdigit(rut[i])==0){
printf("%c, %d\n", rut[i], isdigit(rut[i]));
printf("RUT INVALIDO, ingrese otro: ");
scanf("%s", &rut[7]);
}
else
i++;

}


return 0;
getchar();
}
En línea
Flakito81

Desconectado Desconectado

Mensajes: 378



Ver Perfil
Re: validador hecho en c, conpila pero no funciona
« Respuesta #1 en: 02 Septiembre 2008, 15:40 »

Aki todo el mundo se acuerda de santa rita cnd llueve. No he mirado tu código, pero me ha llamado la atención los scanf's
Código:
scanf("%s", &rut[7]);
En línea
Flakito81

Desconectado Desconectado

Mensajes: 378



Ver Perfil
Re: validador hecho en c, conpila pero no funciona
« Respuesta #2 en: 02 Septiembre 2008, 23:22 »

Ahora que tengo más tiempo comentaré tu programa.

1- Para que pones string.h ?
2- qué pretendes hacer con esto:
Código
scanf("%s", &rut[7]);
¿estás seguro que sabes que es un array? ¿conoces los tipos de datos y las cadenas de control del scanf/printf? si la cosa no ha cambiado %s es para cadena de caracteres y array es una celda del array, si array es una cadena de caracteres una posicion de ese array será un caracter. Mencionar tmb que los arrays se indexan desde la posicion 0, eso quiere decir que si declaras un array de 7 elementos las posiciones serán de 0 a 6, el 7 está fuera de rango.
3-
Código
while(rut[i]!=7)
  más de lo mismo array, en tu caso rut es una celda del array; si tienes un array de caractes o cadena de caracteres si haces referencia a rut[ì] tendras un caracter, luego estas buscando en el array el caracter 7 ¿sabes lo que es? BEL o tono de atención (revisa la tabla ASCII que nunca viene mal). Me imagino que en realidad pretendes buscar el fin de la cadena, kizas kisiste poner i != 7, pero si la clave es de tres numeros que pasa? sabes el contenido del resto de las celdas si no has inicializado antes. Propuesta, en vez de 7 pones 0 o '\0' o '\x0' que indica el final de la cadena
4- Para que pones un scanf para leer las respuestas dentro del if, si la palabra no es correcta de poco te va a servir volverla a leer, fíjate que el indice queda dnd mismo asi que si falla en la posicion 2 cnd introduzcas la nueva palabra comenzara evaluando en la posicion 2 y el principio no se mira.
4.1 Si quieres volver a pedir los datos tienes varias maneras:
   - Usas la recursividad:
     Kitale el nombre de main y llamala diferente, cnd falle llama a la funcion nuevamente y debajo de la llamada pones un return para que no evalue nada en la vuelta de la recursividad
   - Método tradicional:
     Renombras la funcion y en la funcion dnd vayas a llamarla pones un do-while. Eso requiere que retornes un valor cnd entre en el if y otro al terminar la funcion, es decir, el que está dentro del if puede retornar 0 y el que está al final de la funcion 1, de esa manera podrás controlar cnd la comprobacion es correcta en el do-while y dependiendo el valor se repite o no.
   -Metodo chapucero: (no reomendable)
   Pones correctamente el scanf e inicializas la i a -1 (ahora te explico)
5- Si tu sólo incrementas el indice (la i) cnd no ha habido fallo me temo que se meterá en un bucle infinito (al no ser q pongas el return en el if). Por eso has de inicializar la i a -1, xq cnd salga se incremetará y se queda en 0.
6- No le veo sentido poner el getchar después del return 0 ¿tú se lo ves?

Hechos los comentarios el resto está bien en apariencia :laugh:
En línea
Kr3c13nt3

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: validador hecho en c, conpila pero no funciona
« Respuesta #3 en: 06 Septiembre 2008, 03:58 »

Gracias por alegrarme el día con tus comentarios. :laugh:

Volviendo al tema...antes que me respondieras..he aquí la variación del código.. con ayuda de un compis  :)
#include <stdio.h>
#include <ctype.h>

/**Este metodo valida si el rut ingresado son solo numeros */
int main(){
     /**He aqui la variable rut en formato char para hacer corroboraciones*/
    char rut[]={'1','2','3','4','l','6',';'};
     int i=0,j=0;

    printf("Ingrese RUT: ");
    scanf("%s", &rut);
    /*Para validar esto se ocupa la funcion isdigit*/
   
   while(i<7) {
      if( isdigit(rut)==0){
         printf("%i, %d\n", rut, isdigit(rut));
         j=1;
         i=7;
      }
        else
         i++;
   }
   if(j==1) {  printf("RUT INVALIDO, ingrese otro: ");
               scanf("%s", &rut);
                }
   else printf("es rut\n");
   return 0;
   getche();
   
   }


Ingrese un codigo numerico y punka.... ;D ;D ;D
En línea
Flakito81

Desconectado Desconectado

Mensajes: 378



Ver Perfil
Re: validador hecho en c, conpila pero no funciona
« Respuesta #4 en: 06 Septiembre 2008, 12:33 »

Gracias por alegrarme el día con tus comentarios. :laugh:
Me gusta la ironía, asi q un punto para ti ;)

Veo dos problemas capitales en el último post:

1- No has leido el post que escribí, lo que me indica que:
    - Dedicar 5 minutos de mi tiempo en intentar ayudarte es una perdida de tiempo.
    - No pretendes aprender sino que te den el trabajo hecho.
2- El código tal como lo has puesto no compila, asi que estaría agradecido que dijeras el compilador que usas para yo no usarlo, y no digas q es el dev-c++.
   2.1- Hacíéndole la dos modificaciones para compile te diré que ese código no funciona, es decir, ese código no va a detectar la diferencia entre meter un rut o el código de barras del paquete de mantequilla.

Para no alegrarte el día no comentaré:
 - Como has declarado la variable root rut
 - Ni el código del while
 - Ni la manera en como detectas si es un rut válido o no
 - Ni lo ya comentado en los puntos: 2, 4 y 6 del post anterior

Por mi parte doy por finalizado el tema.

Un saludo! :)
« Última modificación: 06 Septiembre 2008, 13:09 por Flakito81 » En línea
Kr3c13nt3

Desconectado Desconectado

Mensajes: 15


Ver Perfil
Re: validador hecho en c, conpila pero no funciona
« Respuesta #5 en: 06 Septiembre 2008, 21:38 »

Nuevamente, es un honor leer tus cordiales y cariñosas palabras :rolleyes:

En serio, pretendo aprender. Pude quedarme en silencio y decir que el código fuente lo hice solo. Para que no te sientas mal, te  doy las gracias porque has tenido paciencia y haber escrito sugerencias en un tono muy tierno.  ;)

Lo probé anoche y compila. Uso dev-c++, así que me extraña que no te haya funcionado.  (:manzanitas mode on: ->Compile ..aparece Done... ->Run :se abre la ventana...aparece Ingrese Rut: se ingresa números y se cierra el programa. Si ingresas por ejemplo "barney70" lo toma como error. :manzanitas mode off:)

Ahora bien, es mi deber reconocer que aun tiene fallos ( si escribes mas de dos veces letras y números, se sale la aplicación :¬¬ )...Por mi parte buscare mejorar el código. ( Y probaré el camino recursivo.)



En línea
The_Judgement

Desconectado Desconectado

Mensajes: 31


Ver Perfil
Re: validador hecho en c, conpila pero no funciona
« Respuesta #6 en: 06 Septiembre 2008, 21:59 »

Yo he probado el código y sí que funciona, pero da igual que metas numeros o letras porque siempre dice que es rut. No entiendo cómo validas si lo que se introduce es dígito o no.

Código
while(i<7) {
     if( isdigit(rut)==0){
        printf("%i, %d\n", rut, isdigit(rut));
        j=1;
        i=7;
     }
       else
        i++;
  }

No entiendo el bucle, sencillamente. Yo creo que una forma para comprobarlo sería así:

Código
for(i=0; rut[i] != '\0'; i++)
       if(isdigit(rut[i]) == 0)
       {
           j=1;
           break;
       }

Por cierto, si se introduce una cadena de caracteres más grande que 7 hay corrupción de pila, porque al iniciar la cadena de esa forma indicas que tiene que reservar 7 bytes y además no tiene el carácter de fin de cadena por lo que será difícil recorrer el array sin leer fuera de memoria. Una forma correcta de inicializarlo sería:

Código:
char rut[20];

 y después deberías comprobar antes de acceder a la cadena de caracteres que no supera 20 la longitud. Otra cosa que veo absurda es iniciar la variable rut si luego pides que se introduzca por teclado.

Deberías leer todos los puntos de flakito, te harán pensar e investigando un poco entenderías mejor y aprenderías mucho sobre cadenas de caracteres, que a fin de cuentas estamos hablando de punteros y es lo más difícil de entender en C y es algo muy útil una vez comprendido.

Tendrías también que mirarte la función isdigit, para saber qué argumentos de entrada tiene y su tipo, porque según la usas parece que no sabes qué tiene que recibir.
http://c.conclase.net/librerias/macro.php?mac=isdigit

Es totalmente absurdo colocar getche() después del return como ya te dijo flakito en su primer post.

Todavía es más absurdo pedir que se introduzca otra palabra en caso de que rut contenga caracteres distintos de números sin haber metido en un bucle la comprobación para que en caso de error vuelva a comprobarlo. Según lo tienes te pediría introducir una nueva palabra y se terminaría el programa.

Saludos.
« Última modificación: 07 Septiembre 2008, 13:20 por The_Judgement » En línea
Flakito81

Desconectado Desconectado

Mensajes: 378



Ver Perfil
Re: validador hecho en c, conpila pero no funciona
« Respuesta #7 en: 07 Septiembre 2008, 02:15 »

Por aluciones. No pretendo ser borde, aunque tampoco cariñoso, si tienes errores lo normal es q te los digan y cnd se te hacen sugerencias y/o se te explica xq es un error y, además, se te dice como solucionarlo; deberías agradecerlo y aceptar los comentarios y las soluciones, y no ser ironic@/sarcastic@, aunque me reafirmo en que me gusta la ironía (y a veces el sarcasmo).

Aclaro que mi comentario en relación a que el código no compila lo justifico en brevemente.
Código
char rut[]={'1','2','3','4','l','6',';'};
 
Ignorando la inicialización tan ... mejor me callo. Se está declarando un array de caracteres, un char * para que quede mas claro.
Código
if( isdigit(rut)==0)
 
Le estan pasando a isdigit un puntero a caracter, y si la cosa no ha cambiado a isdigit se le pasa un caracter.

Yo personalmente lo haría de manera iterativa más que recursiva, ya que esta última consume más recursos y el ahorro de codigo es nulo.

Version 1:
Código
int validar(){
   char rut[8];
   int i=0, lenght;
 
   printf("Ingrese RUT: ");
   scanf("%s",rut);
   if ((lenght = strlen(rut)) != 7)  //-- diferente a 7 cifras
      return 0;
   while (i < lenght && isdigit(rut[i])) i++;
   if (i != lenght)  //-- existe algun caracter invalido
       return 0;
  return 1;
}
 
int main ()
{
  while (!validar());
  printf ("continuamos\n");
  system("pause");
  return 0;    
}
 

version 2:
Código
int validar(){
   char rut[8];
   int lenght;
 
   printf("Ingrese RUT: ");
   scanf("%s",rut);
   if ((lenght = strlen(rut)) != 7)  //-- diferente a 7 cifras
      return 1;
   while (lenght >= 0 && isdigit(rut[lenght-1])) lenght--;
   return lenght;
}
 
int main ()
{
  while (validar());
  printf ("continuamos\n");
  system("pause");
  return 0;    
}
 

Version 3:
Código
int validar(){
   char rut[8];
   int i=0, lenght;
 
   printf("Ingrese RUT: ");
   scanf("%s",rut);
   lenght = strlen(rut);
   while (lenght == 7 && i < lenght && isdigit(rut[i])) i++;
   if (i != lenght)  //-- existe algun caracter invalido
       return 0;
   return 1;
}
 
int main ()
{
  while (!validar());
  printf ("continuamos\n");
  system("pause");
  return 0;    
}
 
Version 4:
Código
int validar(){
   char rut[8];
   int i, lenght;
 
   printf("Ingrese RUT: ");
   scanf("%s",rut);
   i = lenght = strlen(rut);
   while (lenght == 7 && i >= 0 && isdigit(rut[i-1])) i--;
   return i;
}
 
int main ()
{
  while (validar());
  printf ("continuamos\n");
  system("pause");
  return 0;    
}
 
Version 5:
Código
int validar(char *rut){
   int i, lenght;
   i = lenght = strlen(rut);
   while (lenght == 7 && i >= 0 && isdigit(rut[i-1])) i--;
   return i;
}
 
int main ()
{
  char rut[8];
  printf("Ingrese RUT: ");
  scanf("%s",rut);
  while (validar(rut));
  printf ("continuamos\n");
  system("pause");
  return 0;    
}
 

Ya estoy cansado, si kieres hacerlo de otra manera te pones a teclear.

Chao!




En línea
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.7 | SMF © 2006-2008, Simple Machines LLC