Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: feedf en 4 Julio 2013, 22:31 pm



Título: funcion validar un pasword
Publicado por: feedf en 4 Julio 2013, 22:31 pm
buenas tardes gente tengo que hacer una funcion que valide usuario y contraseña y qe se pueda ingresar 3 veces, el tema es que cuando i=1 funciona bien pero luego en 2 y 3 no me la valida aunq ponga bien los usuarios y contraseñas yo creo que debe ser un problema con el strcmp que arrastra basura del primer bucle pero nose como limpiarlo me pueden ayudar?
Código:
void pas(char,char) 
{
const char contrasenav[11]="contrasena";
const char usuariov[8]="usuario";
int i,h;
i=0;
h=0;
char contrasena[100],usuario[100];


for(i=1;i<=3;i++)
{

printf("ingrese nombre de usuario:");
fflush(stdin);
gets(usuario);

printf("ingrese la contrasena:");
do
{contrasena[h]=getch();
printf("*");
h++;
}while(contrasena[h-1]!=13);
contrasena[h-1]='\0';


  if (strcmp(usuariov, usuario)!= 0 || strcmp(contrasenav, contrasena)!=0)
{



printf("\nusuario y/o contrasena invalidos\n\n");


}

else
{
break;
}

if(i==3)
{
printf("no tiene mas oportunidades para probar");

exit(0);
}

}


Título: Re: funcion validar un pasword
Publicado por: CCross en 5 Julio 2013, 00:41 am
Yo lo dejaria mas o meno asi

Código
  1. void pass(char *nombre, char *mi_clave)
  2. {
  3.    const char clave[] = "contrasena";
  4.    const char usuario[] = "usuario";
  5.  
  6.    int cierto = 0, intentos = 3;
  7.  
  8.    do
  9.    {
  10.        printf("\nIntroduzca nombre de usuario: ");
  11.        scanf("%s", nombre);
  12.  
  13.        printf("\nIntroduzca la clave: ");
  14.        scanf("%s", mi_clave);
  15.  
  16.        if(strcmp(clave, mi_clave)==0 && strcmp(usuario, nombre)==0) {
  17.          printf("\nUsuario y/o contrasena validos");
  18.          cierto = 1;
  19.         }
  20.        else if( intentos ) {
  21.          printf("\nAcceso Denegado ...intentos restantes %d ", intentos);
  22.          intentos--;
  23.        }
  24.        else {
  25.          printf("\nNo tiene mas oportunidades para probar");
  26.          break;
  27.        }
  28.     }
  29.     while(!cierto);
  30.  
  31. }
  32.  

Saludos  :)


Título: Re: funcion validar un pasword
Publicado por: ecfisa en 5 Julio 2013, 02:10 am
Hola.

Otra forma de encarar tu código es enviando el nombre y la contraseña esperados, ejemplo:

Código
  1. ...
  2. int login(const char*, const char*);
  3.  
  4. int main()
  5. {
  6.  char* nom="pepe",* pass="1234";
  7.  if (!login(nom,pass)) {
  8.    printf("Ha agotado la cantidad de intentos. Presione una tecla para salir.");
  9.    getchar();
  10.    return 1;
  11.  }
  12.  printf("\n\n! Bienvenido %s !",nom);
  13.  getchar();
  14.  return 0;
  15. }
  16.  
  17. int login(const char* username, const char* userpaswd)
  18. {
  19.  char name[100], pwd[100], ch;
  20. int i , c;
  21.  
  22. for(i=1; i<=3; i++) {
  23.  printf("Nombre de usuario:");
  24.  scanf("%100s", &name);
  25.    while(getchar()!='\n');
  26.  
  27.  printf("Contrasena:");
  28.    c = 0;
  29.    do {
  30.      ch = getch();
  31.      printf("*");
  32.      if (ch != '\n' || ch!='\r'){
  33.        pwd[c++] = ch;
  34.      }
  35.    } while(ch != '\n' && ch !='\r' && c < 100);
  36.    pwd[c-1] = '\0';
  37.  
  38.    if (strcmp(name, username)==0 && strcmp(pwd, userpaswd)==0)
  39.      return 1;
  40.    else
  41.      printf("\n\nNombre de usuario o contrasena invalido (intento %d de 3)\n\n",i);
  42.  }
  43.  return 0;
  44. }
  45.  
  46.  

Saludos :)


Título: Re: funcion validar un pasword
Publicado por: rir3760 en 5 Julio 2013, 02:49 am
el tema es que cuando i=1 funciona bien pero luego en 2 y 3 no me la valida aunq ponga bien los usuarios y contraseñas
Si apenas empiezas en tu aprendizaje del lenguaje C lo recomendado es evitar el uso de "fflush(stdin)", gets y la biblioteca conio de Borland. Mas información en la pagina |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).

Dos errores en esa función son la falta de los nombres de los parámetros y no inicializar a cero la variable "h" antes del bucle donde se pide la contraseña. Esto ultimo es lo que provoca que la función no reconozca la contraseña como valida.

Tampoco es necesario inicializar una variable con un valor cuando lo primero que haces con ella es almacenar otro valor:
Código
  1. i=0;
  2.  
  3. /* ... */
  4.  
  5. for (i = 1; i <= 3; i++)
En un caso así hay que eliminar (por superflua) la primera asignación.

La función con las correcciones:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. void val_pas(char const *nombre_ok, char const *contrasena_ok) ;
  6.  
  7. int main(void)
  8. {
  9.   val_pas("foo", "bar");
  10.  
  11.   return EXIT_SUCCESS;
  12. }
  13.  
  14.  
  15. void val_pas(char const *nombre_ok, char const *contrasena_ok)
  16. {
  17.   char nombre[100];
  18.   char contrasena[100];
  19.   int i;
  20.   int h;
  21.  
  22.   for (i = 0; i < 3; i++){
  23.      printf("Ingrese nombre de usuario: ");
  24.      fflush(stdout);
  25.      gets(nombre); /* Hay que cambiar por fgets */
  26.  
  27.      printf("Ingrese la contrasena: ");
  28.      fflush(stdout);
  29.      for (h = 0; (contrasena[h] = getch()) != '\r'; h++){
  30.         putchar('*');
  31.         fflush(stdout);
  32.      }
  33.      contrasena[h] = '\0';
  34.      putchar('\n');
  35.  
  36.      if (strcmp(nombre, nombre_ok) == 0 && strcmp(contrasena, contrasena_ok) == 0)
  37.         break;
  38.      else
  39.         puts("Nombre y/o contrasena invalidos");
  40.   }
  41.  
  42.   if (i ==3){
  43.      puts("No tiene mas oportunidades para probar");
  44.      exit(EXIT_FAILURE);
  45.   }
  46. }

Faltan algunos cambios como la sustitución de gets por fgets, no lo agregue para no hacer mas largo el programa pero es algo que debes evitar (de nuevo hay que leer la pagina sobre recomendaciones).

Un saludo


Título: Re: funcion validar un pasword
Publicado por: feedf en 5 Julio 2013, 05:21 am
wow muchas gracias por las respuestas me ayudaron un monton !! voy a leer el articulo que me pasaste justamente hace 2 meses aproximadamente empece a programar y aca estoy remando jaj,

ya que estoy pregunto por ejemplo ami me enseñaron a usar printf, pero veo mucha gente q usa cin y cut o veo q vos ahora usaste puts, tienen alguna diferencia?


mil gracias !


Título: Re: funcion validar un pasword
Publicado por: ecfisa en 5 Julio 2013, 10:58 am
...
ya que estoy pregunto por ejemplo ami me enseñaron a usar printf, pero veo mucha gente q usa cin y cut o veo q vos ahora usaste puts, tienen alguna diferencia?
Hola.

Depende si estas programando en C o C++.

Como C++ está basado en C, el compilador no se quejará si utilizas printf o scanf, etc. Aunque, si estas compilando en C++, es mejor utilizar las funciones proias de él.
La situación no es reversible, no se pueden utilizar funciones propias de C++ tales como cout o cin en C.

Saludos :)


Título: Re: funcion validar un pasword
Publicado por: amchacon en 5 Julio 2013, 14:10 pm
Rir37, se te ha olvidado quitar la librería conio  ;)


Título: Re: funcion validar un pasword
Publicado por: rir3760 en 5 Julio 2013, 17:01 pm
veo mucha gente q usa cin y cut o veo q vos ahora usaste puts, tienen alguna diferencia?
En C cuando se requiere imprimir texto con formato se utiliza printf, por ejemplo:
Código
  1. int a = 123;
  2.  
  3. /* ... */
  4.  
  5. printf("El valor de a es %d\n", a);

Para imprimir una cadena literal terminada con un avance de linea se puede utilizar printf o puts, aquí es mejor la segunda ya que el carácter '\n' se imprime automáticamente después del texto:
Código
  1. printf("hola, mundo\n");
  2.  
  3. /* O bien */
  4. puts("hola, mundo");

Un saludo


Título: Re: funcion validar un pasword
Publicado por: feedf en 9 Julio 2013, 17:51 pm
interesante muchas gracias !