figboy Posted April 7, 2018 at 08:23 PM Report #610109 Posted April 7, 2018 at 08:23 PM (edited) Boa noite a todos. Tenho de fazer uma função para fazer login de um utilizador e tenho de usar ficheiros para guardar a informação dos utilizadores. Sendo assim a minha ideia seria ter uma pasta em que cada ficheiro tem o como nome o próprio nome do utilizador e dentro desse ficheiro tinha a sua password. A primeira coisa que estava a pensar fazer é abrir o diretório onde estão os ficheiros dos utilizadores e verificar se existe algum ficheiro com o nome de utilizador que foi introduzido ao fazer login. O código que fiz foi este, mas está me a dar o erro "Falha de segmentação (imagem do núcleo gravada)" e não estou a conseguir perceber onde é o erro. Para além disso acho que não estou a conseguir fazer o que pretendo, mas não estou a ver como o fazer. int login() { char user[20], pass[20]; printf("utilizador:"); //nome de utilizador scanf("%s", &user); printf("Password:"); scanf("%s", pass); //password do utilizador DIR *acesso; struct dirent *d; acesso = opendir("Projeto/Login/Administradores"); while ( (d =readdir(acesso)) != NULL){ if ((d==user){ printf("User encontrado"); } else { printf("User não encontrado"); } } } Se alguém conseguir me dar umas luzes fico muito agradecido. EDIT: Já percebi de onde vem o erro, é no caminho do opendir. Se eu puser o caminho completo já não dá erro(apesar de que continuo sem conseguir que a função faça o que preciso). Contudo eu não queria colocar o caminho completo, queria colocar o caminho apenas a partir de onde tenho o executável para conseguir que o programa funcione em qualquer pc, há maneira de fazer isto? Obrigado Cumps Edited April 7, 2018 at 09:34 PM by figboy
HappyHippyHippo Posted April 8, 2018 at 09:07 AM Report #610112 Posted April 8, 2018 at 09:07 AM um caminho relativo é indicado com o . o que deverias colocar seria : ./Projeto/Login/Administradores o problema principal é que não validas o resultado da função opendir além disso, não é assim que se compara strings ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 8, 2018 at 10:57 AM Author Report #610113 Posted April 8, 2018 at 10:57 AM (edited) Obrigado já deu para resolver o erro, apesar de que tive de usar dois pontos em vez de um único ponto. Agora não estou a conseguir fazer a comparação do nome dos ficheiros que estão no diretório com o nome que foi inserido pelo utilizador. O que tenho é isto. int login() { char user[20], pass[20]; printf("utilizador:"); //nome de utilizador scanf("%s", &user); printf("Password:"); scanf("%s", pass); //password do utilizador DIR *acesso; struct dirent *entry; acesso = opendir("../Projeto/Login/Administradores"); if(!acesso){ printf("Erro no opendir: %s\n", strerror(errno)); } while ( (entry=readdir(acesso)) != NULL){ if (strcmp(entry->d_name, user)==0){ printf("User encontrado"); } else { printf("User não encontrado"); } } } É na condição do while que estou a fazer mal ou tenho de usar outros comandos? Obrigado Edited April 8, 2018 at 10:58 AM by figboy
HappyHippyHippo Posted April 8, 2018 at 12:54 PM Report #610114 Posted April 8, 2018 at 12:54 PM aqui tens um exemplo de como deves fazer : http://pubs.opengroup.org/onlinepubs/7908799/xsh/readdir.html 1 Report IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 8, 2018 at 06:07 PM Author Report #610115 Posted April 8, 2018 at 06:07 PM Muito obrigado pela tua ajuda. Consegui por essa parte a funcionar. Agora queria usar a manipulação de ficheiros para abrir o ficheiro desse utilizador e verificar se a palavra pass está errada mas tenho outra vez o erro de falha de segmentação mas pelo que vi não é no caminho do fopen e não estou a conseguir perceber de onde vem o erro. Já agora é possível usar uma variável num path? Por exemplo guardo o nome de usuário que é escrito na variável user e depois no path queria fazer isto : "./Projeto/Login/Adiministradores/user". int login_pass(){ char pass[20], pass1[20]; printf("Password:"); scanf("%s", &pass); FILE *password= fopen("../Projeto/Login/Administradores/figboy.txt", "r"); if (!password){ printf("Erro no fopen: %s", strerror(errno)); } while((fscanf(password, "%s", pass1) !=EOF)) { if((strcmp(pass, pass1)==0)){ printf("Login completo"); } else{ printf("Palavra pass errada"); } } } Obrigado
HappyHippyHippo Posted April 8, 2018 at 06:43 PM Report #610116 Posted April 8, 2018 at 06:43 PM responde a esta simples questão : o que retorna a função fscanf ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 8, 2018 at 06:48 PM Author Report #610117 Posted April 8, 2018 at 06:48 PM Já experimentei a por return 0 mas continuo com o mesmo erro. int login_pass(){ char pass[20], pass1[20]; printf("Password:"); scanf("%s", &pass); FILE *password= fopen("../Projeto/Login/Administradores/figboy.txt", "r"); if (!password){ printf("Erro no fopen: %s", strerror(errno)); } while((fscanf(password, "%s", pass1) !=EOF)) { if((strcmp(pass, pass1)==0)){ printf("Login completo"); return 0; } else{ printf("Palavra pass errada"); return 0; } } }
HappyHippyHippo Posted April 8, 2018 at 07:02 PM Report #610118 Posted April 8, 2018 at 07:02 PM responde à pergunta ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 8, 2018 at 07:12 PM Author Report #610119 Posted April 8, 2018 at 07:12 PM Pelo que percebi o fscanf retorna a quantidade de correspondências realizadas ou o EOF quando chega ao fim do ficheiro ou quando encontra algum erro
HappyHippyHippo Posted April 8, 2018 at 09:10 PM Report #610121 Posted April 8, 2018 at 09:10 PM ok, agora que tens o valor no ficheiro na variável pass1, o que tens na variável pass ? e se a função retorna um inteiro, que inteiro é esse ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 8, 2018 at 10:04 PM Author Report #610122 Posted April 8, 2018 at 10:04 PM No pass1 vou ter as strings que estiverem no ficheiro, neste caso será 123 porque é a única string que está no ficheiro. Na variável pass vou ter o que o usuário escreve, neste caso também 123. E acho que a função retorna 1 porque só encontra uma string
HappyHippyHippo Posted April 8, 2018 at 10:18 PM Report #610123 Posted April 8, 2018 at 10:18 PM indica em que parte do código indica que o valor retornado é 1 IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 8, 2018 at 10:21 PM Author Report #610124 Posted April 8, 2018 at 10:21 PM Dentro da condição do while, acho
HappyHippyHippo Posted April 9, 2018 at 05:32 AM Report #610126 Posted April 9, 2018 at 05:32 AM Qual linha? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 9, 2018 at 06:50 AM Author Report #610127 Posted April 9, 2018 at 06:50 AM Acho que é nesta parte, fscanf(password, "%s", pass1)
HappyHippyHippo Posted April 9, 2018 at 06:58 AM Report #610128 Posted April 9, 2018 at 06:58 AM é nessa parte que retorna 1 ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 9, 2018 at 07:02 AM Author Report #610129 Posted April 9, 2018 at 07:02 AM Eu diria que sim. Mas eu estou a aprender por isso é provável que esteja a pensar mal
HappyHippyHippo Posted April 9, 2018 at 01:19 PM Report #610140 Posted April 9, 2018 at 01:19 PM antes de tudo, como nada nessa instrução indica retorno da função, logo nunca será resposta para a questão, segundo, se é um segmentatin fault, deverias apresentar o código inteiro, porque pode muito bem ser noutro local IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
figboy Posted April 9, 2018 at 04:01 PM Author Report #610148 Posted April 9, 2018 at 04:01 PM Aqui está o código completo #include <stdio.h> #include <stdlib.h> #include <dirent.h> #include <sys/types.h> #include <string.h> #include <errno.h> void login_user() { char user[20]; printf("utilizador:"); //nome de utilizador scanf("%s", &user); DIR *acesso; struct dirent *entry; acesso = opendir("../Projeto/Login/Administradores"); struct dirent { off_t d_off; // offset para este dirent char d_name[]; // nome do arquivo }; acesso = opendir("../Projeto/Login/Administradores"); if(!acesso){ printf("Erro no opendir: %s\n", strerror(errno)); } while (acesso) { if ((entry = readdir(acesso)) != NULL) { //Verifica se existe o user if (strcmp(entry->d_name, user) == 0) { closedir(acesso); login_pass(); } }else { if (errno == 0) { closedir(acesso); printf("user não encontrado\n"); login_user(); } closedir(acesso); } } } int login_pass(){ char pass[20], pass1[20]; printf("Password:"); scanf("%s", &pass); printf("Erro: %s", strerror(errno)); FILE *password= fopen("../Projeto/Login/Administradores/figboy.txt", "r"); if (!password){ printf("Erro no fopen: %s", strerror(errno)); } while(fscanf(password,"%s\n", pass1) !=EOF ){ if((strcmp(pass, pass1)==0)){ printf("Login completo"); } else{ printf("Palavra pass errada"); } } } int main(void) { printf("**Menu de Registo**\n"); printf("1)Login/Autenticação\n"); printf("2)Sair\n"); int opcao; scanf("%d", &opcao); if (opcao==1){ login_user(); } if (opcao==2){ exit(0); } if( opcao !=1 && opcao !=2){ printf("Escolha uma opção válida\n"); } return 0; } Então a verificação que estou a tentar fazer para a password está errada? Podes me dar umas luzes de como deveria fazer? É que não estou mesmo a ver como posso fazer. Obrigado mais uma vez
HappyHippyHippo Posted April 10, 2018 at 02:12 PM Report #610162 Posted April 10, 2018 at 02:12 PM este é o output de compilação do teu código : src/main.c: In function 'login_user': src/main.c:12:10: error: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[20]' [-Werror=format=] scanf("%s", &user); ~^ ~~~~~ src/main.c:12:10: error: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[20]' [-Werror=format=] src/main.c:35:13: error: implicit declaration of function 'login_pass'; did you mean 'login_user'? [-Werror=implicit-function-declaration] login_pass(); ^~~~~~~~~~ login_user src/main.c: In function 'login_pass': src/main.c:55:10: error: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[20]' [-Werror=format=] scanf("%s", &pass); ~^ ~~~~~ src/main.c:55:10: error: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[20]' [-Werror=format=] src/main.c:76:1: error: control reaches end of non-void function [-Werror=return-type] } ^ tens de resolver isso primeiro ... tem atenão ao argumento do teu scanf : pointeiro para o local onde irá guardar os dados dica : pointeiro IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now