funcion validar un pasword

Iniciado por feedf, 4 Julio 2013, 22:31 PM

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

feedf

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?
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);
}

}

CCross

#1
Yo lo dejaria mas o meno asi

Código (cpp) [Seleccionar]
void pass(char *nombre, char *mi_clave)
{
   const char clave[] = "contrasena";
   const char usuario[] = "usuario";

   int cierto = 0, intentos = 3;

   do
   {
       printf("\nIntroduzca nombre de usuario: ");
       scanf("%s", nombre);

       printf("\nIntroduzca la clave: ");
       scanf("%s", mi_clave);

       if(strcmp(clave, mi_clave)==0 && strcmp(usuario, nombre)==0) {
         printf("\nUsuario y/o contrasena validos");
         cierto = 1;
        }
       else if( intentos ) {
         printf("\nAcceso Denegado ...intentos restantes %d ", intentos);
         intentos--;
       }
       else {
         printf("\nNo tiene mas oportunidades para probar");
         break;
       }
    }
    while(!cierto);

}


Saludos  :)

ecfisa

Hola.

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


...
int login(const char*, const char*);

int main()
{
  char* nom="pepe",* pass="1234";
  if (!login(nom,pass)) {
    printf("Ha agotado la cantidad de intentos. Presione una tecla para salir.");
    getchar();
    return 1;
  }
  printf("\n\n! Bienvenido %s !",nom);
  getchar();
  return 0;
}

int login(const char* username, const char* userpaswd)
{
  char name[100], pwd[100], ch;
int i , c;

for(i=1; i<=3; i++) {
  printf("Nombre de usuario:");
  scanf("%100s", &name);
    while(getchar()!='\n');

  printf("Contrasena:");
    c = 0;
    do {
      ch = getch();
      printf("*");
      if (ch != '\n' || ch!='\r'){
        pwd[c++] = ch;
      }
    } while(ch != '\n' && ch !='\r' && c < 100);
    pwd[c-1] = '\0';

    if (strcmp(name, username)==0 && strcmp(pwd, userpaswd)==0)
      return 1;
    else
      printf("\n\nNombre de usuario o contrasena invalido (intento %d de 3)\n\n",i);
  }
  return 0;
}



Saludos :)

rir3760

Cita de: feedf en  4 Julio 2013, 22:31 PMel 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|.

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:
i=0;

/* ... */

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:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void val_pas(char const *nombre_ok, char const *contrasena_ok) ;

int main(void)
{
   val_pas("foo", "bar");
   
   return EXIT_SUCCESS;
}


void val_pas(char const *nombre_ok, char const *contrasena_ok)
{
   char nombre[100];
   char contrasena[100];
   int i;
   int h;
   
   for (i = 0; i < 3; i++){
      printf("Ingrese nombre de usuario: ");
      fflush(stdout);
      gets(nombre); /* Hay que cambiar por fgets */
     
      printf("Ingrese la contrasena: ");
      fflush(stdout);
      for (h = 0; (contrasena[h] = getch()) != '\r'; h++){
         putchar('*');
         fflush(stdout);
      }
      contrasena[h] = '\0';
      putchar('\n');
     
      if (strcmp(nombre, nombre_ok) == 0 && strcmp(contrasena, contrasena_ok) == 0)
         break;
      else
         puts("Nombre y/o contrasena invalidos");
   }
   
   if (i ==3){
      puts("No tiene mas oportunidades para probar");
      exit(EXIT_FAILURE);
   }
}


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
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

feedf

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 !

ecfisa

Cita de: feedf en  5 Julio 2013, 05:21 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 :)

amchacon

Rir37, se te ha olvidado quitar la librería conio  ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

rir3760

Cita de: feedf en  5 Julio 2013, 05:21 AMveo 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:
int a = 123;

/* ... */

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:
printf("hola, mundo\n");

/* O bien */
puts("hola, mundo");


Un saludo
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

feedf