Ir ao conteúdo

Posts recomendados

Postado

725309461_WhatsAppImage2021-05-04at21_27_11.thumb.jpeg.1d112c9cca3af14f693c5e16a2c178b4.jpeg

Estou na parte 2 (Alterar senha) e não consigo dar continuidade, sou estudante, e comecei a aprender agora em C, se alguém puder me ajudar fiaria muito grato.

Segue condigo onde parei (else if):

#include <stdio.h>
#include <stdlib.h>
#define cls system("cls");
void delay();
#include <string.h>
int main(){
    int codigo, senha=100932, ret, senhan, senha1;
    char nome[7]={"helio"},nome2[7];  
    do{
        cls
        printf("Para prosseguir escolha uma das tres opcaos.\n");
        printf("(1) login\n");
        printf("(2) alterar senha\n");
        printf("(3) sair.\n");
        scanf("%d", &codigo);
    }while(codigo < 1 || codigo > 3);
 	  
	    if(codigo == 1){
        do{
            cls
            printf("Informe o nome de login: ");
            scanf("%s",nome);
            ret = strcmp(nome,nome2);
            if(ret = 0){
                printf("Acesso negado \nInforme o nome de login:\n");
                delay();
            }
        }while( ret );
        printf("Informe a senha: ");    
        while(scanf ("%d", &senha1), senha1!=senha){ 
            printf("Acesso negado \nInforme a senha: ");
        }
        printf("Acesso Permitido.");
        return main();
    }else if( codigo == 2){
    	printf("Digite a senha atual: \n");
    	while(scanf ("%d", &senha1), senha1!=senha){ 
            printf("Acesso negado \n");
            return main();
        }
        printf("Digite a nova senha: \n");
        scanf("%d", senhan);
        
        strcpy(senha,senhan);
        printf("A nova senha eh: %d \n" senha);
	}
    return 0;
}
void delay() 
{
    for(int i=0; i<60000; i++)  
        for(int i=0; i<20000; i++);
}

 

 

 

 

 

 

 

Postado

Oih @Helio Junnior Sartor Dalmolin a função strdcpy que tenta usar para copiar senha nova em senha é apropriada somente para "stings" (tipo composto de alguns primitivos char) e não serve nesse caso, especificamente. 

 

Entendo que senha nova e senha são definidas/declaradas do tipo inteiro (tipo primitivo int) e nesse caso é atribuição direta e com operador de atribuição (=). Como você é iniciante, talvez não tenho sido claro suficiente até agora, ainda assim, tente resolver só com essa explicação.

 

 

2 horas atrás, Helio Junnior Sartor Dalmolin disse:

printf("Digite a nova senha: \n");

scanf("%d", senhan);

Falta o operador (&)! O conhecido por "endereço de", ele é a única maneira que as funções têm para acessar e modificar valores entre elas de espaço local para espaço local, acessando a variável lá onde ela se encontra na memória do computador, por essa razão "endereço de" existe.

 

2 horas atrás, Helio Junnior Sartor Dalmolin disse:

printf("A nova senha eh: %d \n" senha);

Faltou a vírgula que separa os parâmetros reais: "A nova senha eh: %d \n", senha

 

 

  • Curtir 1
Postado

Olá @Helio Junnior Sartor Dalmolin, mano eu vi aqui que seu código possui alguns erros, por exemplo:

 

image.png.5822e9179cbfada39877d7d57ae89bb3.png

Na linha 24 você deixou de usar o "&" junto da variável para informar ao computador onde você quer que ele armazene o valor recebido pelo usuário, interessante isso pois na linha 17 você não esquece de usar:

 

image.png.b3c5aa9bff5b1fb43de8d9fab8dc5fac.png

Precisa prestar um pouco mais de atenção.

O mesmo ocorre na linha 45:

 

image.png.32e5714c366939d0005129eaf7f257c4.png

Como o mauro_b havia dito

32 minutos atrás, mauro_b disse:

a função strdcpy que tenta usar para copiar senha nova em senha é apropriada somente para "stings" (tipo composto de alguns char)

 Então é provável que isso não de certo:

image.png.b48b562240c22b505b59a4bc0867eabd.png

Sabendo que a variável senha e senhan foram declaradas como inteiras:

image.png.cb7cea353d517db0fa2c8d645304d466.png

Na linha 48 esta faltando uma virgula entre o texto que quer ser exibido pelo printf e a variável: 

image.png.ee6c5d8b55671eb8fbb0d26771c3bcf0.png 

 

2 horas atrás, Helio Junnior Sartor Dalmolin disse:

Estou na parte 2 (Alterar senha) e não consigo dar continuidade, sou estudante, e comecei a aprender agora em C, se alguém puder me ajudar fiaria muito grato.

 

Em relação a segunda parte, vejo que você já tem total capacidade para dar continuidade ao exercício,só precisa de um empurrãozinho.

Vamos lá, no enunciado pede-se para verificar se a senha atual esta correta para só então alterar a senha com uma nova, você poderia pedir a senha atual ao usuário e depois disso verificar com um if se ela é a mesma que foi declarada no inicio do código image.png.c325cf9cc99285b93a99b68c96c4ad07.png  caso ela não seja igual você pode printar na tela uma mensagem de erro ao usuário, caso contrario é só você armazenar o novo valor informado na variável senha.

  • Confuso 1
Postado
2 minutos atrás, thefill disse:

image.png.5822e9179cbfada39877d7d57ae89bb3.png

Na linha 24 você deixou de usar o "&" junto da variável para informar ao computador onde você quer que ele armazene o valor recebido pelo usuário, interessante isso pois na linha 17 você não esquece de usar:

 

image.png.b3c5aa9bff5b1fb43de8d9fab8dc5fac.png

Precisa prestar um pouco mais de atenção.

`nome` é uma string, não precisa do &, eu postei sobre isso ontem aqui:

E é mais conveniente usar fgets() para ler strings.

Postado

@Helio Junnior Sartor Dalmolin Se criar uma função para retornar a opção do menu, acho que deixa o código mais simples de controlar e voltar ao menu principal. E com o retorno da função você pode usar a opção escolhida nos ifs e no while,

 

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

int menu(){
    int opcao;
    int n;
    do{
        printf("%s",
            "1) Login\n"
            "2) Alterar Senha\n"
            "3) Sair\n: "
        );
        scanf("%d%*c", &n);
        opcao = (n >= 1 && n <= 3);
        if(!opcao){
            printf("** OPCAO INVALIDA **\n");
        }
    }while(!opcao);
    return n;
}

int main(){
    int opcao;
    do{
        opcao = menu();
    }while(opcao != 3);
    return 0;
}

 

Assim vai sair do loop principal com a opção 3 e nas outras continua no menu. Após a entrada de umas das opções (1 ou 2) só falta colocar as operações da entrada de login e alteração de senha,

 

do{
    opcao = menu();
    if(opcao == 1){
            
    }
    if(opcao == 2){
        
    }
...

 

Para login e senha poderia usar apenas strings para comparar com strncmp após a entrada com a função fgets,

int main(){
    char login[20] = "login";
    char senha[20] = "12345";
...

 

Testando a entrada,

...
printf("Login: ");
fgets(nlogin, 20, stdin);
printf("Senha: ");
fgets(nsenha, 20, stdin);
iguais =
    !strncmp(login, nlogin, strlen(login)) && 
    !strncmp(senha, nsenha, strlen(senha));
}while(!iguais);
printf("** ACESSO LIBERADO **\n");

 

  • Curtir 1
Postado

Está seguindo pelo caminho mais difícil.

 

Sabe o que é uma função porque tem uma no programa.

 

Curiosamente a única função que tem no programa não faz nada, exceto contar loucamente até 1,2 milhão para gastar um tempo, delay(). 

 

Sugiro escrever funções que façam algo. E para não fazer nada não é esperto usar um loop que fica contando. Você usa o sistema e pede um alerta, usando Sleep() ou algo similar. 

 

Não é correto usar o sistema ativamente para não fazer nada...

 

Seu programa tinha muitos erros. Poste o programa como está agora. E TESTE SEMPRE o retorno de scanf(). Não tem um manual? Uma apostila?

 

Não use um int para senha. É muito mais fácil ler apenas strings e deixar a senha com um certo número de dígitos e pronto. Qual a vantagem de usar int e não por exemplo char[8]? Não se opera com senhas. Apenas compara ou criptografa...

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!