alphasil Posted April 18, 2012 at 01:05 PM Report #449677 Posted April 18, 2012 at 01:05 PM Olá Tenho este código de login, funciona mas tem um comportamento estranho... oid admin() { char login [10], pass [10]; int x, a=1 , b=1; for (x=0; x<3; x++) { printf("Utilizador: \n"); scanf("%s", &login); fflush(stdin); printf("Password: \n"); scanf("%s", &pass); fflush(stdin); a= strcmp(login,"gil"); b= strcmp(pass, "123"); if (a==0 && b==0) { printf("Bem vindo \n"); //Chamar um menu de escolha para o Admin menu_admin(); break; } else { printf("Tente de novo \n"); } } printf("Tentativas exedidas, vai voltar ao menu inicial..\n"); menu_principal(); } Quer acerte na pass quer não acerte a última frase entra sempre e vai para o menu principal. Alguma sugestão? Obrigado gmc11
petvetbr Posted April 18, 2012 at 01:51 PM Report #449691 Posted April 18, 2012 at 01:51 PM Sim, eh isto mesmo. Acho que para fazer o que você deseja precisa mudar o código colocando uma flag dentro do for e no final fazer a escolha de qual rotina chamar. int loginok=0; for... { se usuário e pass ok -> loginok=1 break } if(loginok==1) menuadmin() else menuprincipal() O que acontece no código atual é que ele sempre vai chamar o menuprincipal indepndente do resultado do logon. Fernando Lage Bastos - MCP/MCTS/MCPD
pmg Posted April 18, 2012 at 02:10 PM Report #449696 Posted April 18, 2012 at 02:10 PM Quando fazes o break sais do ciclo for. A instrução imediatamente a seguir é o tal print. Solução rápida: altera o x (a variável de controlo do ciclo) para um valor "ilegal" (por exemplo 5) e condiciona o print para x == 3. Além disso, não precisas do & no scanf e deves limitar o input ao espaço disponível. E o fflush(stdin) só é reconhecido, segundo penso, pelo compilador da Microsoft. O fflush(stdin) é uma instrução ilegal segundo o Standard. Não assumas que funciona em todos os sistemas como funciona no teu sistema actual. Se conseguires alterar o teu código para não teres essa falha de compatabilidade melhor. void admin() { char login [10], pass [10]; int x, a=1 , b=1; for (x=0; x<3; x++) { printf("Utilizador: \n"); scanf("%9s", login); fflush(stdin); printf("Password: \n"); scanf("%9s", pass); fflush(stdin); a= strcmp(login,"gil"); b= strcmp(pass, "123"); if (a==0 && b==0) { printf("Bem vindo \n"); //Chamar um menu de escolha para o Admin menu_admin(); x = 5; break; } else { printf("Tente de novo \n"); } } if (x == 3) printf("Tentativas exedidas, vai voltar ao menu inicial..\n"); menu_principal(); } What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
alphasil Posted April 18, 2012 at 02:23 PM Author Report #449702 Posted April 18, 2012 at 02:23 PM Obrigado Era mesmo isso, não tinha reparado no break; Já agora se quiser criar um ficheiro que vai ter esta estrutura: ID_Pergunta|Pergunta|Opção1|Opção2|Opção3|Opção4|RespostaCorrecta em que o utilizador ao ler a pergunta e escolher obtém a resposta certa.. Preciso de escrever um ficheiro com esta estrutura...mas como?? cumps e mais uma vez obrigado gmc11
pmg Posted April 18, 2012 at 02:33 PM Report #449705 Posted April 18, 2012 at 02:33 PM Já agora ... Para uma pergunta nova, não relacionada com o tópico desta pergunta, faz um novo tópico. Não te esqueças de leres a pergunta como se fosses responder ... e fornece as informações que achas necessárias para facilitar as respostas. What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
BlueKore Posted April 18, 2012 at 03:00 PM Report #449716 Posted April 18, 2012 at 03:00 PM Vejo vários usos da função fflush. Essa função não pertence ao ANSI C. Não te recomendo a usares isso!
pmg Posted April 18, 2012 at 03:09 PM Report #449718 Posted April 18, 2012 at 03:09 PM Vejo vários usos da função fflush. Essa função não pertence ao ANSI C. Não te recomendo a usares isso! Não é bem assim ... A função fflush pertence ao ANSI C, sim. O que não "pertence" é o uso da função com streams de input, ou com streams de input e output nos quais a última operação efectuada tenha sido de input. Mas, lá pelo Standard dizer que uma coisa é comportamento não definido, não quer dizer que as implementações não o definam. O mal está em não saber que se está a usar um extra. No compilador da microsoft, com a biblioteca do Windows, o "fflush(stdin)" está definido ... If the stream is open for input, fflush clears the contents of the buffer. ... fflush( stdin ); // fflush on input stream is an extension to the C standard ... What have you tried? Não respondo a dúvidas por PM A minha bola de cristal está para compor; deve ficar pronta para a semana. Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!
Dr_Lion Posted April 21, 2012 at 06:40 PM Report #450438 Posted April 21, 2012 at 06:40 PM Ler a password dessa forma não a torna visível ao ser escrita, não sei se é importante, mas existem funções que permitem ler caracteres sem que estes sejam "representados" no ecrã.
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