Ir ao conteúdo

C Comparar string com strings de um vetor


Ir à solução Resolvido por devair1010,

Posts recomendados

Postado

Olá, estou com o seguinte problema.

 

Estou tentando criar um sistema de login simples com base em um FILE.
A ideia é que o usuário crie seu acesso com login e senha e que ambos em sejam armazenados no FILE.
Depois de criado, jogarei todos os dados do FILE para um vetor[10][100] e aí preciso comparar cada elemento do vetor com o login e depois com a senha.

 

OBS:

  • Sou totalmente iniciante em programação e C, praticamente 1 mês, então desconsiderem possíveis erros grotescos.
  • O sistema é para fins acadêmicos, então não precisa estar 100% clean, apenas funcional.

 

Segue uma parte do código:

int crtuser(){ //função para criar um usuário

    char id[20];
    int tam;

    FILE *logincred;
    logincred = fopen("login.txt","a");

    printf("\nCrie seu login de usuário com até 20 caracteres: \n");
    scanf("%s",&id);
    tam = strlen(id);
    if(tam>20){
        printf("Limite de caracteres excedido, tente novamente.");
        return crtuser();
    }
    fprintf(logincred,"%s\n",id);
    fclose(logincred);
}


int access(){ //função para acessar o sistema

    FILE *logincred;
    logincred = fopen("login.txt","r");

    char id[20];
    char pwd[10];
    char ida[20];
    char pwda[10];
    char accs[10][100];
    int i;


    printf("Digite seu usuário:\n");
    scanf("%s",&ida);
    for(i=0;i<10 && fgets(accs[i],100,logincred) != NULL;i++){
        if(strcmp(accs[i],ida)==0){
            fscanf(logincred,"%s",id);
        }else{
            printf("Login não localizado.");
            break;
        }

  	printf("Digita sua senha: \n");
  	scanf("%s",&pwda);
  	for(i=0;i<10 && fgets(accs[i],100,logincred) != NULL;i++){
    	if(strcmp(accs[i],pwda)==0){
        	fscanf(logincred,"%s",pwd);
        }else{
      		printf("Senha não localizada.");
        }
    }
  	

    if(strcmp(ida,id)==0 && strcmp(pwda,pwd)==0){
        printf("Acesso realizado com sucesso. \n");
    }else{
        printf("Usuário ou senha incorreto. Tente novamente. \n");
        return access();
    }
    fclose(logincred);
}

 

 

Obrigado pela ajuda desde já!

  • Curtir 1
  • Solução
Postado

@LuizFer17     seria melhor postar todo o código , mas a leitura no arquivo depende de como foi feito a gravação nele ,  e ali você está gravando apenas o nome do usuário ,  poderia gravar junto a senha , na hora de salvar no arquivo , você está pegando o nome do usuário , com scanf , e esse só pega os caracteres digitados até encontrar um espaço , e aí termina a leitura , e assim a pessoa só vai inserir o primeiro nome dela , e outra coisa é que na hora de ler no arquivo , você está usando fgets , que le todos os caracteres  da linha até encontrar o newline "\n" e pega ele também , e assim na hora  de fazer a comparação nunca será igual , pois o nome pego com scanf não tem "\n" e o que o fgets pegou têm "\n" , então se usar scanf para pegar o nome para gravar no arquivo , você pode usar um  Loop parecido com esse , para ver se está guardado no arquivo  :

na hora de gravar coloque assim no arquivo :

nome1 senha1
nome2 senha2
     .
     .
  
nome10 senha10

usando essa função :

int crtuser()  //função para criar um usuário
{     
    char id[21],senha[21];    
    int tam;    
    FILE *logincred;    
    logincred = fopen("login.txt","a");    
    if(logincred == NULL)    
    logincred = fopen("login.txt","w");     
    inicio :    
    printf("\nLogin de usuário com seu nome de até 20 caracteres: ");    
    scanf("%s", id);    
    tam = strlen(id);    
    if( tam > 20 )    
    {        
        printf("Limite de caracteres excedido, tente novamente.");        
        goto inicio;    
    }    
    pega_senha :    
    printf("\nSenha minimo 8 caracteres e maximo 20 : ");    
    scanf("%s",senha);    
    tam = strlen( senha );    
    if( tam < 8 || tam > 20 )    
    {        
        printf("Limite de caracteres excedido, tente novamente.");        
        goto pega_senha;    
    }    
    fprintf(logincred,"%s "  ,id   );    
    fprintf(logincred,"%s \n",senha);    
    fclose(logincred);
}

essa aqui para ler no arquivo :

int acess()
{
    char nome[21] , senha[21]; // vinte para o nome ou senha e hum para o \0 da string
    inicio :
    int nom=0;
    printf("nome de usuario ");
    scanf("%s",nome);
    log :
    int logyn=0;
    printf("senha com 8 caracteres ");
    scanf("%s",senha);
    while( scanf(arq,"%s",nome) != EOF )
    {    
        if( strcmp( nome, ida ) == 0 )    
        {        
            nom = 1;        
            break;    
        }
    }
    if( strcmp( scanf(arq,"%s",senha ),senha) == 0 )    
        logyn=1;
    fclose( logincred );
    if( logyn == 1 && senha ==1 )    
        printf("Login ReaLizado Com Sucesso !\n");    
        return 1;// retorna 1 informando que o login está certo
    }
    else
    {    
        if( nom == 0 )    
        {        
            printf("o nome não Cadastrado !\n");        
            goto inicio;    
        }    
        if(logyn == 0 )    
        {        
            printf("senha não Incorreta !\n");        
            goto log;    
        }
    } 
    return 0; // retorna 0 informando que o login está errado
}

 

  • Curtir 1
Postado

@devair1010  Olá, obrigado pela resposta.

Entendi o que me informou, porém, surgiram algumas dúvidas.
Primeiro ponto, eu ajustei a função de criação de login conforme sugeriu.
Função de criação de login:

 

int crtuser(){

    char id[21], senha[21];
    int tam;

    FILE *logincred;
    logincred = fopen("login.txt","a");
    if(logincred==NULL){
        logincred = fopen("login.txt","w");
    }
    inicio :
    printf("\nCrie seu login de usuário com seu primeiro nome: \n");
    scanf("%s",&id);
    tam = strlen(id);
    if(tam > 20){
        printf("Limite de caracteres excedido, tente novamente.");
        goto inicio;
    }
    check_pass :
    printf("\nCrie sua senha com 8 à 20 caracteres.\n");
    scanf("%s",&senha);
    tam = strlen(senha);
    if(tam < 8 || tam > 20){
        printf("Senha não segue os critérios, tente novamente.");
        goto check_pass;
    }
    fprintf(logincred,"%s ",id);
    fprintf(logincred, "%s \n", senha);
    fclose(logincred);
}



O segundo ponto é na função de acesso,

- o codigo que você passou, seria um incremento do meu ou um novo?
- no loop while eu não entendi a sintaxe do scanf, por ele consigo ler dados de um arquivo ou somente com fscanf?
- eu não entendi a lógica do código, pois eu quero cadastrar mais de um login, como ocorreria a leitura de linha por linha? não consegui visualizar o incremento.
 

int access(){

    char nome[21], senha[21];

    FILE *logincred;
    logincred = fopen("login.txt","r");

    log: ;
    int nm=0;
    printf("\nDigite seu usuário:\n");
    scanf("%s",&nome);

    pwd: ;
    int sn=0;
    printf("\nDigite sua senha: \n");
    scanf("%s",&senha);

    while(scanf(logincred,"%s",nome)!= EOF){
        if(strcmp(nome,nome)==0){
            nm = 1;
            break;
        }
    }

    if(strcmp(scanf(logincred,"%s",senha),senha)==0){
        sn=1;
    }

    fclose(logincred);

    if(nm == 1 && sn == 1){
        printf("Acesso realizado com sucesso. \n");
        return 1;
    }else if(nm == 0){
        printf("Login não cadastrado. \n");
        goto log;
    }else if(sn == 0){
        printf("Senha incorreta.");
        goto pwd;
    }
    return 0;
}


Obrigado novamente pela ajuda.

 

  • Curtir 1
Postado

@LuizFer17   realmente é fscanf , para ler no arquivo , como não tinha o restante do código não testei e ficou esse scanf , mas ele não lê no arquivo não , o que eu disse é que para cadastrar você cadastre o nome e a senha ao mesmo tempo e no arquivo grave o nome e pule um espaço e coloque a senha ,assim na hora de comparar ao encontrar o nome buscado , os próximos dados depois do espaço será a senha .

  e a função de acesso , é a mesma , apenas modifique o for pelo while  . e mais algumas coisa e menos algumas coisa que estavam nela .

  • Curtir 1
Postado

Obrigado @devair1010consegui ajustar e resolver com o fscanf.

Caso ajude alguém, deixo aqui o cod corrigido.

 

int access(){

    char nome[21], senha[21], id[21], pw[21];

    FILE *logincred;
    logincred = fopen("/home/k4nek1/Desktop/login.txt","r");

    log: ;
    int nm=0;
    printf("\nDigite seu usuário:\n");
    scanf("%s",&nome);
    while(fscanf(logincred,"%s",id)!= EOF){
        if(strcmp(nome,id)==0){
            nm = 1;
            break;
        }
    }

    pwd: ;
    int sn=0;
    printf("\nDigite sua senha: \n");
    scanf("%s",&senha);
    while(fscanf(logincred,"%s",pw)!= EOF){
        if(strcmp(pw,senha)==0){
            sn = 1;
            break;
        }
    }

    fclose(logincred);
    if(nm == 1 && sn == 1){
        printf("Acesso realizado com sucesso! \n");
        menup(); //função criada para acessar o menu de cadastro.
    }else if(nm == 0){
        printf("Login não cadastrado. Tente novamente.\n");
        goto log;
    }else if(sn == 0){
        printf("Senha incorreta.");
        goto pwd;
    }
}

 

  • Curtir 1

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

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!