Ir ao conteúdo
  • Cadastre-se

C Comparar string digitada com strings em txt


PenseC

Posts recomendados

Olá, pessoas de outro mundo.

Desculpe por atrapalhar seu dia de domingo.

Estou com um problema que simplesmente não consigo resolver.

Eu estava treinando linguagem C e fiz um código para simular um acesso com login e senha. Eu criei um Txt com 3 logins, um em cada linha.

Meu objetivo é: O usuário digita (1) Entrar, então ele digita um login e o programa vai comparar o que ele digitou com cada linha do txt. Caso alguma linha seja igual o que ele digitou, vai pedir a senha.

Quando eu digito a primeira linha, funciona. Mas se eu digitar o conteúdo da segunda ou terceira linha, o programa diz que o login não existe. Sendo que eu sei que existe porque foi eu quem escreveu! ^^'

Meu código é o seguinte:

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


int main()
{
    char login[20];
    char logindigitado[20];
    char logincadastro[20];
    char senha[10];
    char senhadigitada[10];
    int opções,i=2;
    double horas,vendas;

   printf("\t\t\t\t-----------------------------------------------------\n");
   printf("\t\t\t\t  Digite o numero correspondende a opcao desejada:\n");
   printf("\t\t\t\t-----------------------------------------------------\n");
   printf("\t\t\t\t(1)Entrar\n");
   printf("\t\t\t\t(2)Cadastrar\n");
   printf("\t\t\t\t(3)Sair\n");
   printf("\t\t\t\t-----------------------------------------------------\n");
   printf("\t\t\t\t"); scanf("%i",&opções);

    switch(opções)
    {
        case 1:
    system("cls");
   FILE* f;
   f =fopen("login.txt","r");
    printf("\t\t\t\t------------------------------\n");
    printf("\t\t\t\t       Digite seu login:\n");
    printf("\t\t\t\t------------------------------\n");
    printf("\t\t\t\t");scanf("%s",logindigitado);
    while( fgets(login,20,f) != NULL) // O problema está aqui. Quando eu digito o login, só a primeira linha é reconhecida.
    {

        if(strncmp(login,logindigitado,12)==0)
        {
        system("cls");
        printf("\t\t\t\t------------------------------\n");
        printf("\t\t\t\t Digite sua senha de 6 numeros:\n");
        printf("\t\t\t\t------------------------------\n");
        printf("\t\t\t\t");scanf("%s",senhadigitada);
        }
        else if(strncmp(login,logindigitado,12)!=0)
        {

            while ((strncmp(login,logindigitado,12)!=0))
            {

                system("cls");
                printf("\t\t\t\tLogin incorreto. Tente novamente.\n");
                printf("\n");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t       Digite seu login:\n");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t");scanf("%s",logindigitado);
            }
            if(strncmp(login,logindigitado,12)==0)
            {
                system("cls");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t Digite sua senha de 6 numeros:\n");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t");scanf("%s",senhadigitada);


            }

        }


        fclose(f);
        FILE *s;
        s = fopen("senhas.txt","r");
        while(fgets(senha,10,s)!=NULL)
            fclose(s);
        {
            if(strncmp(senha,senhadigitada,6)==0)
            {
                system("cls");
                printf("\t\t\t\t ------------------------------\n");
                printf("\t\t\t\tCALCULO SALARIAL\n");
                printf("\t\t\t\t ------------------------------\n");

                printf("\t\t\t\tDigite suas horas trabalhadas:\n");
                printf("\t\t\t\t");scanf("%lf",&horas);
                printf("\n");
                printf("\t\t\t\tDigite o valor das vendas feitas:\n");
                printf("\t\t\t\t");scanf("%lf",&vendas);

                system("cls");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\tO valor do salario de %s: \n",logindigitado);
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t  --->    %.2f    <---",horas*12,5+vendas*1,2);
            }
            else if (strncmp(senha,senhadigitada,6)!=0)
            {
                while(strncmp(senha,senhadigitada,6)!=0)
                {
                       system("cls");
                       printf("\t\t\t\t\Senha incorreta!\n");
                       printf("voce tem %i chances.\n",i);
                       printf("\t\t\t\t------------------------------\n");
                       printf("\t\t\t\t Digite sua senha de 6 numeros:\n");
                       printf("\t\t\t\t------------------------------\n");
                       printf("\t\t\t\t");scanf("%s",senhadigitada);
                       i--;


                      if (i==0)
                      {
                          system("cls");
                          printf("\t\t\t\t---------------------------------------------------\n");
                          printf("\t\t\t\t\t  voce ERROU SUA SENHA 3 VEZES\n");
                          printf("\t\t\t\t SENHA BLOQUEADA. PROCURE UMA AGENCIA PARA AJUDA-LO.\n");
                          printf("\t\t\t\t---------------------------------------------------\n");
                          exit(0);
                      }
                      if(strncmp(senha,senhadigitada,6)==0)
                      {
                        system("cls");
                printf("\t\t\t\t ------------------------------\n");
                printf("\t\t\t\tCALCULO SALARIAL\n");
                printf("\t\t\t\t ------------------------------\n");

                printf("\t\t\t\tDigite suas horas trabalhadas:\n");
                printf("\t\t\t\t");scanf("%lf",&horas);
                printf("\n");
                printf("\t\t\t\tDigite o valor das vendas feitas:\n");
                printf("\t\t\t\t");scanf("%lf",&vendas);

                system("cls");
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\tO valor do salario de %s: \n",logindigitado);
                printf("\t\t\t\t------------------------------\n");
                printf("\t\t\t\t  --->    %.2f    <---",horas*12,5+vendas*1,2);
                      }


                }
            }

        }



        }

        break;

        case 2:
            printf("Digite um login para cadastro:\n");
            scanf("%s", logincadastro);
            break;


        case 3:
            printf("Obrigado!! Volte sempre!!\n");
            exit(0);
    }



        return 0;
    }

Desculpem pelo código amador. Fiz um comentário onde acho que é o problema.

Meu arquivo em txt tem duas linhas:

Pablo1234567

Adrielle1783

 

Se eu digito "Pablo1234567", ele pede a senha.

Agora, se eu digito "Adrielle1783" ele diz que o login é incorreto.

Se alguém puder me ajudar, ficarei grato.

Obrigado desde já!

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Tem algo a ver com os ponteiros internos do arquivo. Veja se isso ajuda:

Spoiler

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

int pesquisarNoArquivo(char *nomeArquivo, char *usuario);

int main() {
    char *nomeArquivo = "";  // Coloque o nome do arquivo aqui
    int encontrou = 0;

    encontrou = pesquisarNoArquivo(nomeArquivo, "Rafaela123");
    printf("Encontrou 'Rafaela123'? %s \n", (encontrou == 1 ? "Sim" : "Nao"));

    encontrou = pesquisarNoArquivo(nomeArquivo, "Larissa");
    printf("   Encontrou 'Larissa'? %s \n", (encontrou == 1 ? "Sim" : "Nao"));

    encontrou = pesquisarNoArquivo(nomeArquivo, "Larissa321");
    printf("Encontrou 'Larissa321'? %s \n", (encontrou == 1 ? "Sim" : "Nao"));

    return EXIT_SUCCESS;
}

int pesquisarNoArquivo(char *nomeArquivo, char *usuario) {
    // Pode ler uma linha com 1000 caracteres
    const size_t tamanho = 1000;
    char *linha = (char *) malloc(tamanho * sizeof(char));

    int encontrou = 0;

    FILE *arquivo = fopen(nomeArquivo, "r");

    if (arquivo == NULL) {
        fprintf(stderr, "[ E ]: Arquivo nao encontrado. \n");
        exit(EXIT_FAILURE);
    }

    while (fgets(linha, tamanho, arquivo) != NULL && encontrou == 0) {
        linha[strcspn(linha, "\n")] = '\0';

        encontrou = strcmp(linha, usuario) == 0;
    }

    fclose(arquivo);
    return encontrou;
}

 

 

Meu arquivo está assim:

Spoiler

Rafaela123
Larissa321

 

 

No lugar de ficar abrindo e fechando o arquivo toda hora, você poderia chamar a função 

rewind(arquivo);

antes de fazer a leitura do arquivo. Essa função reseta os ponteiros do arquivo, dessa forma a leitura começará no início do arquivo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

17 horas atrás, PenseC disse:

int opções,i=2;

 

Seu programa parece muito complicado e difícil de ler, e não acho que precise ser assim

 

  • antes de tudo: NUNCA use acentos em nomes de variáveis. Nem em comentários. Mesmo em constantes, entenda que nada acrescentam e só podem criar problema então se o enunciado não exigir fuja disso.
  • não declare mais de uma variável por linha. É grátis o uso de linhas e encavalar declarações não ajuda em nada
  • inicializa TODAS as variáveis
  • não use variáveis globais com um nome ingênuo como "i". É muito arriscado acabar usando por engano onde não deveria.
  • você tem um livro? um manual? SEMPRE teste o retorno de scanf(). É ingênuo seguir com o programa sem saber se de fato leu algo. No fundo evite ao máximo usar scanf() para ler do teclado. Essa função não foi escrita para isso. Basta ver o nome dela.
  • você sabe escrever funções? Use algumas. Simplifica muito o código

 

Sobre usuario, senha e arquivo

 

O simples em geral é abrir o arquivo de senhas no inicio e fazer algo como preencher dois vetores, usuarios[] e senhas[] e colocar os dados lá. Assim quando o cara digita um usuário você procura na tabela de usuários e ao achar o nome a senha estará na coluna correspondente na tabela de senhas. É muito mais fácil.

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...