password confirmation in c

Asked

Viewed 191 times

0

I need to register N people in my program with only two information: name and password. Then the user enters a name, if this name is not registered the program displays a message of no registration and closes, but if Tver registered it asks the password, if the password is correct the program only shows a message if access allowed, if the password is wrong the user has 3 chances to hit, if in the 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 memory fields.

#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;
}

1 answer

2


Ana, I did so and it is working, 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 '\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 chained lists.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.