password confirmation on c

0

I need to register N people in my program with only two information: name and password. After the user enters a name, if this name is not registered the program displays a non-registration message and closes, but if it is registered it asks the password, if the password is right the program only shows a message if access allowed, if the password is wrong the user has 3 chances to hit, if in 3 chances he misses the program closes. The problem is that my program is taking the password of person 1 and adding the name of person 2 and I am not able to identify the error, since the password has only 6 fields of memory.

#define N 5
struct pessoa
{
    char nome[30];
    char senha[6];
};
int main()
{
    struct pessoa cadastro[N];
    int i,j;
    char nome[30],senha[6];

    for(i=0;i<N;i++)
    {
        puts("\nDigite o nome:\n");
        fflush(stdin);
        gets(cadastro[i].nome);
        puts("\nInsira uma senha de ate 6 digitos:\n");
        fflush(stdin);
        gets(cadastro[i].senha);
    }

    system("cls");
    puts("\nInsira um nome:");//nome de busca
    fflush(stdin);
    gets(nome);


    for(i=0;i<N;i++)
    {

        printf("%s",cadastro[i].senha);// este printf só coloquei pra ver o que estava sendo armazenado em cadast[i].senha
        if(strcmp(cadastro[i].nome,nome)==0)
        {
            do
            {
                puts("\nInforme sua senha:");
                fflush(stdin);
                gets(senha);
                if(strcmp(cadastro[i].senha,senha)==0)
                {
                    j=0;
                    puts("\nAcesso permitido.");
                    break;
                }
                else
                {
                    j=j+1;
                    puts("\nSenha incorreta.");
                    if(j==3)
                    {
                        break;
                        return 0;
                    }
                }
            }while (j!=0);

        }
        else
        {puts("\nNome nao cadastrado.\n");}break;
    }
return 0;
}
    
asked by anonymous 10.04.2017 / 05:36

1 answer

2

Ana, I did that and it works, your problem should be in relation to the buffer, since it is using fflush, or gets to read the strings.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Pessoa {
    char nome[20];
    int senha;
    struct Pessoa *arr;
};

void limpaBuffer() {
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);
}
struct Pessoa* leitura() {

    struct Pessoa *p = malloc(sizeof(struct Pessoa));
    p->arr = malloc(2 * sizeof(struct Pessoa));

    printf("\tCadastrando Usuarios\n");
    for(int i=0; i<2; i++) {
       printf("\nEntre com o nome: ");
       gets(p->arr[i].nome); //aqui poderia usar o fgets, mas daria muito trabalho para por o carctere '
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Pessoa {
    char nome[20];
    int senha;
    struct Pessoa *arr;
};

void limpaBuffer() {
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);
}
struct Pessoa* leitura() {

    struct Pessoa *p = malloc(sizeof(struct Pessoa));
    p->arr = malloc(2 * sizeof(struct Pessoa));

    printf("\tCadastrando Usuarios\n");
    for(int i=0; i<2; i++) {
       printf("\nEntre com o nome: ");
       gets(p->arr[i].nome); //aqui poderia usar o fgets, mas daria muito trabalho para por o carctere '%pre%' no final
       printf("Entre com a senha: ");
       scanf("%d", &p->arr[i].senha);
       limpaBuffer();
    }
    return p;
}

int main()
{
    struct Pessoa *p;
    p = leitura();

    int contador = 0;
    char nome[20];
    int senha;

    printf("\n\n\tVerificando Usuario\n");

    do {

        printf("\nEntre com o Usuario: ");
        gets(nome);
        printf("Entre com a senha: ");
        scanf("%d", &senha);
        limpaBuffer();
        ++contador;

        for(int i=0; i<2; i++) {
        if(!strcmp(nome, p->arr[i].nome) && senha == p->arr[i].senha) {
            printf("\nParabens voce acertou!");
            exit(0);
        } else {
            printf("\nVoce errou! Restam %d tentativas.", 3 - contador);
            break;
        }
      }
    }while(contador < 3);

    return 0;
}
' no final printf("Entre com a senha: "); scanf("%d", &p->arr[i].senha); limpaBuffer(); } return p; } int main() { struct Pessoa *p; p = leitura(); int contador = 0; char nome[20]; int senha; printf("\n\n\tVerificando Usuario\n"); do { printf("\nEntre com o Usuario: "); gets(nome); printf("Entre com a senha: "); scanf("%d", &senha); limpaBuffer(); ++contador; for(int i=0; i<2; i++) { if(!strcmp(nome, p->arr[i].nome) && senha == p->arr[i].senha) { printf("\nParabens voce acertou!"); exit(0); } else { printf("\nVoce errou! Restam %d tentativas.", 3 - contador); break; } } }while(contador < 3); return 0; }

If you want something better read from a file, or use linked lists.

    
10.04.2017 / 18:03