Jump to content

Recommended Posts

Posted

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

 

Posted

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

Posted

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!

Posted

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

 

Posted

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!

Posted

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!

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.