elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Poner contraseña
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Poner contraseña  (Leído 3,662 veces)
Risketo

Desconectado Desconectado

Mensajes: 37



Ver Perfil
Poner contraseña
« en: 25 Julio 2012, 02:05 am »

Buenas, estudiando c quería hacer un programa que pidiese contraseña y simplemente termine cuando se ponga la contraseña correcta.
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6. char passwd[]="xD", texto[3];  
  7.  
  8. do {
  9. printf ("Introduce la contrasena: ");
  10. fgets(texto,3,stdin);
  11.  
  12. if (strcmp(passwd, texto)==0){
  13. printf ("Contrasena correcta");
  14. }
  15. else {
  16. printf ("Contrasena incorrecta\n");
  17. }
  18. }
  19. while (strcmp(passwd, texto)!=0);
  20.  
  21. return 0;
  22. }
  23.  


El código compila sin errores y funciona al poner la contraseña correcta, pero cuando pongo una incorrecta me devuelve lo siguiente:


Código:
Introduce la contraseña: sfsd
Contraseña incorrecta
Introduce la contraseña: Contraseña incorrecta
Introduce la contraseña: Contraseña incorrecta
Introduce la contraseña:


Y si introduzco la contraseña seguido de algo mas la da por valida, por ejemplo:


Código:
Introduce la contraseña: xDasf
Contraseña correcta

Muchas gracias de antemano.


En línea

Fire544

Desconectado Desconectado

Mensajes: 85


"Escucha el sonido del 0, 1"


Ver Perfil WWW
Re: Poner contraseña
« Respuesta #1 en: 25 Julio 2012, 03:30 am »

A ver intenta limpiar con fflush en stdin antes de la entrada con fgets() y modifica la iteraccion while(strcmp(passwd, texto)==0) por while(texto[0]==0); Suerte !! :xD


« Última modificación: 25 Julio 2012, 03:35 am por Fire544 » En línea

"Si enseñas a pezcar a un niño lo ayudas para toda la vida, si pezcas para alimentarlo lo ayudas por un momento".
durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Poner contraseña
« Respuesta #2 en: 25 Julio 2012, 07:45 am »

Hola! no es recomendado usar fflush para stdin ya que no esta definido.

Este problema ya fue discutido muchas veces asi que voy a ser lo mas claro posible. Cuando se ingresan caracteres por teclado, estos se almacenan en un "bufer" para que luego funciones como fgets, scanf, etc tomen los caracteres de ahi.
Aclaracion 1: el ENTER(\n) tambien es un caracter, osea que tambien se almacena en el bufer
Aclaracion 2: fgets lee hasta encontrar un ENTER o como maximo n-1 caracteres
Supongamos que se ingresa esta cadena: "xDabcde\n". En este caso vos indicaste a fgets que lea 3-1 caracteres, es decir los caracteres 'x' y 'D' se almacenan en el arreglo texto. Es por esto que si se ingresa cualquier cadena, siempre y cuando empiece con "xD", imprime "contraseña correcta" (Esto seria la respuesta a tu segunda duda)

Ahora supongamos que se ingresa otra cadena: "asdfzxc\n". ¿que sucede ahora? como antes los primeros dos caracteres('a' y 's') se almacenan en texto y se imprime "contraseña incorrecta". ¿pero por que despues no podes ingresar y vuelve a imprimir "contraseña incorrecta" varias veces? Esto se debe a que en el bufer aun queda el resto de la cadena: "dfzxc\n". Para solucionar esto hay que limpiar el bufer; despues de fgets agrega:
Código
  1. while(getchar()!='\n'); // getchar lee del bufer hasta encontrar un '\n', osea limpia el bufer


Saludos
En línea

Ahorrate una pregunta, lee el man
Risketo

Desconectado Desconectado

Mensajes: 37



Ver Perfil
Re: Poner contraseña
« Respuesta #3 en: 25 Julio 2012, 16:47 pm »

Muchas gracias me ha servido lo del fgets pero si pongo un while(getchar()!='\n'); se produce un buble infinito.


Edito: si modifico el fgets por fgets(texto,30,stdin); no tengo problema al poner una contraseña incorrecta, pero no sirve la correcta, la verdad es que no se que puede ser.
« Última modificación: 25 Julio 2012, 18:47 pm por Risketo » En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Poner contraseña
« Respuesta #4 en: 25 Julio 2012, 19:33 pm »

Veo que aun no entendiste bien(no es un tema facil al principio). Lo que hace el getchar() dentro del  while es ir leyendo del bufer caracter por caracter hasta encontrar un ENTER, osea limpia el bufer... ¿¿¿seguro te genera un bucle infinito??? es raro

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6. char passwd[]="xD", texto[3];  
  7.  
  8. do {
  9. printf ("Introduce la contrasena: ");
  10. fgets(texto,3,stdin);
  11.                while(getchar()!='\n');
  12.  
  13. if (strcmp(passwd, texto)==0){
  14. printf ("Contrasena correcta");
  15. }
  16. else {
  17. printf ("Contrasena incorrecta\n");
  18. }
  19. }
  20. while (strcmp(passwd, texto)!=0);
  21. system("PAUSE");
  22. return 0;
  23. }

Creo q tampoco sabes bien el uso de fgets(), mira este link: http://c.conclase.net/librerias/?ansifun=fgets


Saludos
En línea

Ahorrate una pregunta, lee el man
Risketo

Desconectado Desconectado

Mensajes: 37



Ver Perfil
Re: Poner contraseña
« Respuesta #5 en: 25 Julio 2012, 20:10 pm »

Me generaba un buble infinito porque cambié el fgets por fgets(texto,30,stdin).
Y respecto al fgets, como le ordeno que si lee por ejemplo xDasd lo de por incorrecto?

Gracias a todos por responder.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Poner contraseña
« Respuesta #6 en: 26 Julio 2012, 02:13 am »

Los problemas del programa original son dos: el primero es el tamaño del array para almacenar la linea introducida por el usuario y el segundo que no eliminas (si es el caso) el resto de la linea.

El primero se elimina simplemente ajustando el tamaño del segundo array para que pueda contener la contraseña mas un carácter adicional y el segundo revisando la linea introducida por el usuario (cortesía de la función "strchr"): si no se encuentra el carácter '\n' significa que hay que descartar caracteres (el resto de la linea).

En cuanto a tu segunda pregunta "fgets" solo lee la linea, si deseas una comparación debes utilizar la función "strcmp".

El programa con las correcciones es:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. int main(void)
  6. {
  7.   char contra[] = "xD";
  8.   char linea[sizeof contra + 1];
  9.   char *p;
  10.  
  11.   while (1){
  12.      printf("Introduce la contrasena: ");
  13.      fflush(stdout);
  14.      if (fgets(linea, (int) sizeof linea, stdin) == NULL)
  15.         return EXIT_FAILURE;
  16.  
  17.      if ((p = strchr(linea, '\n')) != NULL)
  18.         *p = '\0';
  19.  
  20.      if (strcmp(contra, linea) == 0){
  21.         puts("Contrasena correcta");
  22.         break;
  23.      }else if (p == NULL){
  24.         int ch;
  25.  
  26.         while ((ch = getchar()) != EOF && ch != '\n')
  27.            ;
  28.      }
  29.   }
  30.  
  31.   return EXIT_SUCCESS;
  32. }

Un saludo
En línea

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
Risketo

Desconectado Desconectado

Mensajes: 37



Ver Perfil
Re: Poner contraseña
« Respuesta #7 en: 26 Julio 2012, 03:11 am »

Vale, muchas gracias me voy a mirar como funcionan los punteros para entender el programa al 100%.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Poner contraseña a un CD o DVD
Software
abcdef123 2 20,035 Último mensaje 24 Enero 2007, 16:34 pm
por abcdef123
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines