Dev - C++ - Ayuda! error en c, control de acceso

 
Vista:
sin imagen de perfil

Ayuda! error en c, control de acceso

Publicado por Alberto Sors (2 intervenciones) el 27/03/2017 22:37:45
Me encuentro haciendo un simple control de acceso en C pero al volver a pasar por un while (que tengo para controlar el exceso de intentos y si el usuario quiere intentarlo de nuevo) pasa por los pasos pero ya no me deja ingresar el usuario, y se brinca directo al mensaje de error pero si ahi ingreso el usuario, si lo toma.. esta medio raro espero que me puedan ayudar.

Gracias de antemano.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include<stdio.h>
#include<stdlib.h>
#include<string.h> //libreria para manejo de Cadenas(strings) aqui se encuentra el comando strcmp
 
int main(){
 
    char Usuario[]="Sergio Sosa"; //cadena de usuario correcto
    char Contrasena[]="ABCD"; //cadena de contraseña correcta
 
    char Usuarios[50]; // Variable donde se almacenaran los datos ingresados
    char Contrasenas[50];
 
    int x=0;
    int aux=1;
 
    while((x<=3)&&(aux==1)){
        printf("Ingrese ID: ");
        gets(Usuarios); // escanea la variable Usuarios
 
        if(strcmp(Usuarios,Usuario)==0){//strcmp sirve para comparar strings y si son iguales arroja un 0
            printf("Ingresar password: ");
            gets(Contrasenas);
 
 
            if(strcmp(Contrasenas,Contrasena)==0){ //compara contraseñas
                printf("\n\nBienvenido %s\n\n", Usuarios);
            }else{
                printf("Contraseña incorrecta... Abortando\n");
            }
 
 
        }else{
            printf("\nEl usuario ingresado no existe... Abortando\n");
        }
 
        printf("Realizar un nuevo intento?  1=Si 2=No");
        scanf("%i", &aux);
        x++;
    }
 
    if(aux!=1){ //si no desea otro intento
        printf("\nCerrando\n");
    }
 
    if(x>3){ //si sobrepaso el numero de intentos
        printf("\n\nUsted a Exedido el intento de ingresos maximos perimtidos\nAlerta enviada al Administrador");
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Dionicio
Val: 168
Ha aumentado 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Re: Ayuda! error en c, control de acceso

Publicado por Dionicio (57 intervenciones) el 28/03/2017 03:37:35
Primero que nada un saludo. Un primer consejo no uses la función gets() Usa otra como fgets(). El porque al pedir datos se salta la primera variable a requerir( en este caso el ID) es que en el buffer o memoria intermedia queda basura, entonces cuando tu programa vuelva a pedir datos toma esos datos basura y los pone de en la variable que los pide. Para solucionar el problema del buffer te dejo una solución, pero si investigas puedes que lo entiendas mejor, encontraras que en muchos sitios usan fflush(stdin) lo cual es un error ya que dicha función no está hecha para recibir flujos de entrada.

Te aconsejo fgets pero detrás de esta función hay un pequeño inconveniente (no tan grave) y es que luego de tomar la cadena escrita le añade un salto o final de linea por ejemplo a la palabra "hoja" en el programa realmente esta como "hoja\n" por lo tanto no es lo mismo "hoja" que "hoja\n" pero lo puedes resolver cambiando el '\n' por un '\0'. Aquí te dejo tu código trabajando perfectamente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
#include <string.h>
void quitarSalto(char cadena[], int longitud)
{
	if(cadena[longitud-1] == '\n')
	cadena[longitud-1] = '\0';
}
int main(){
 
char Usuario[]="Sergio Sosa"; //cadena de usuario correcto
char Contrasena[]="ABCD"; //cadena de contraseña correcta
 
char Usuarios[50]; // Variable donde se almacenaran los datos ingresados
char Contrasenas[50];
 
int x=0;
int aux=1;
int buff;
 
	while((x<=3)&&(aux==1)){
		printf("Ingrese ID: ");
		fgets(Usuarios,50,stdin); // escanea la variable Usuarios, luego el tamaño, y el metodo de entrada que es el teclado
 
		quitarSalto(Usuarios,strlen(Usuarios));//Elimina el salto que produce fgets
 
		if(strcmp(Usuarios,Usuario)==0){//strcmp sirve para comparar strings y si son iguales arroja un 0
			printf("Ingresar password: ");
			fgets(Contrasenas,50,stdin);
 
			quitarSalto(Contrasenas,strlen(Contrasenas));//Elimina el salto que produce fgets
 
			if(strcmp(Contrasenas,Contrasena)==0){ //compara contraseñas
				printf("\n\nBienvenido %s\n\n", Usuarios);
			}else{
				printf("Contraseña incorrecta... Abortando\n");
			}
		}else{
		printf("\nEl usuario ingresado no existe... Abortando\n");
		}
 
		printf("Realizar un nuevo intento? 1=Si 2=No");
		scanf("%i", &aux);
 
		while((buff = getchar()) != EOF && buff != '\n');//Limpia el buffer
		x++;
	}
 
	if(aux!=1){ //si no desea otro intento
		printf("\nCerrando\n");
	}
 
	if(x>3){ //si sobrepaso el numero de intentos
		printf("\n\nUsted a Exedido el intento de ingresos maximos perimtidos\nAlerta enviada al Administrador");
	}
 
return 0;
}


Cualquier duda es bienvenida!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Re: Ayuda! error en c, control de acceso

Publicado por Sergio (2 intervenciones) el 28/03/2017 08:11:21
Muchas Gracias por su ayuda! solo me quedo con la duda en esta linea

while ((buff = getchar()) != EOF && buff != '\n');//Limpia el buffer

(buff = getchar()) != EOF a que se refiere, o que indica?

Gracias y Buen dia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Dionicio
Val: 168
Ha aumentado 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Re: Ayuda! error en c, control de acceso

Publicado por Dionicio (57 intervenciones) el 28/03/2017 17:07:51
Lo único que dice dicha sentencia es que si en el buffer(lo que tiene esta variable) es diferente de la macro final de archivo (EOF, end of file) o salto de linea ('\n') tiene que seguir sacando esos caracteres que llamamos basura.

Imagina que tenemos una variable llamada "palabra" como la siguiente
1
char palabra[3];
e introducimos por teclado la palabra "hola" la cadena solo tomaría "ho" y el resto ¿dónde crees qué queda? Exacto en lo que llamamos buffer, por lo tanto la sentencia
1
while((buff = getchar()) != EOF && buff != '\n');
lo que hace es tomar esos caracteres que quedaron en la memoria temporal y sacarlos para que no quede basura. Prueba el siguiente código escribiendo palabras con longitud mayor que 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
char palabra[3];
	int buff;
 
	fgets(palabra,3,stdin);
 
     printf("Soy <palabra> y tengo \"%s\"\n",palabra);
 
	printf("Soy el buffer y tengo lo siguientes caracteres: ");
	while((buff = getchar()) != EOF && buff != '\n'){
 
		printf("%c, ",buff);
	}
...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar