Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ricardo_1977

Login com asteriscos

Mensagens Recomendadas

ricardo_1977

boa tarde,

alguem consegue por a password a ser vista no ecra com asteriscos(por exemplo) mas o seu valor correcto a ser guardado numa variavel?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
renafi

Já experimentaste usar o getch()?

Capturas o caracter inserido no teclado, e poes a aparecer no ecra um *


Oracle Certified Professional - AdministraçãoOracle Certified Professional - Pl/sqlMCPD - Microsoft Certified Professional DeveloperMCTS - Microsoft Certified Technology Specialist

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KiNgPiTo

Lol um dos primeiros programas que fiz nas aulas ao aprender C... Ficas aqui com ele:

#include <stdio.h>

int main(){

char pass[100];
char ch;
int aux = 0;

do{

ch = getch(); // recebe caracter

if ( (int)ch != 13) // Inseri o if pois imprimia tambem um asterisco no enter ficando mais um 

asterisco para alem do comprimento da pass
putchar(42); // escreve ascii do asterisco 

pass[aux] = ch; // adiciona o caracter a string da pass
aux++; //Incrementa a posicao..

}
while ( (int)ch != 13 ); // Enquanto não introduzir o Enter 13 na ascii

pass[aux] = '\0'; // Fecha a string

printf("\n\nA tua passe: %s", pass); //Imprime a pass inserida

getchar(); //Espera por algo.. apenas para não fechar a janela sem vermos a ultima impressão

return 0;

}

P.S.: Agora com um bocadinho de experiência vejo que tem algumas não é falhas, mas pormenores a melhorar, mas dá para perceber a ideia...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KiNgPiTo

Bem visto :D Como disse aquilo era um programa dos primeiros dias...

Para isso adiciona-se um if em que se o (int)ch == 8 que é o backspace na ascii ele não faz o putchar e depois das duas uma.. ou se apaga tudo e mete-se só a quantidade de asteriscos igual ao comprimento da string até então, ou brinca-se com o gotoxy e insere um caracter 255 para além de colocar o cursor na posição anterior.

(Agora penso que deve haver uma forma mais simples ;))

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Obvio que estava na brincadeira  ;)

O que se podia fazer era utilizar o caracter de escape \b que dá mesmo um backspace.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Ora bem, vou deixar aqui a minha contribuição. Aproveitei que estou em windows e fiz com o getch.

Fica aqui, então:

#include <stdio.h>

int main(void) {
  char password[120];
  char ch;
  int aux = 0;
  while(ch != 13) {
    ch = getch();
    if(ch != 13 && ch != 8) {
      password[aux] = ch;
      aux++;
      putchar(42);
    }
    if(ch == 8) {
      aux--;
      printf("\b \b");
    } 
  }
  password[aux] = '\0';
  printf("\n%s\n", password);
  getch();
  return 0;
}


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KiNgPiTo

Nem me lembrava do \b... Adaptando a minha ideia, a tua ideia e o código acima algo a funcionar direito seria:

#include <stdio.h>

int main(){

char pass[100];
char ch;
int aux = 0;

do{

ch = getch(); // recebe caracter

if ( (int)ch == 8 ){
printf("\b"); //Apaga o ultimo
putchar(255); //Adiciona um caracter em branco 
printf("\b"); //Volta para a posição anterior
aux--; //Decrementa a posição onde vai ser inserida a letra
}else{

if ( (int)ch != 13 ) // Inseri o if pois imprimia tambem um asterisco no enter ficando mais um asterisco para alem do comprimento da pass e
putchar(42); // escre ascii do asterisco

pass[aux] = ch; // adiciona o caracter a string da pass
aux++; //Incrementa a posicao..

}
}while ( (int)ch != 13 ); // Enquanto não introduzir o Enter 13 na ascii

pass[aux] = '\0'; // Fecha a string

printf("\n\nA tua passe: %s\n", pass); //Imprime a pass inserida

getchar(); //Espera por algo.. apenas para não fechar a janela sem vermos a ultima impressão

return 0;

}

+/- isto :D

EDIT: Usa o do localhost, está bem melhor  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Que confusão que fizeste para aí. Para apagar um printf chega. E não precisas de um cast quando verificas o ch porque os chars são números na verdade (ascii).

p.s. O meu programa vai dar mal num caso. Tenta descobrir  ;)


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KiNgPiTo

Uma coisa mal será no decremento do aux... se já não houver caracteres e apagar na mesma vai para posições negativas...

mas isto com um simples if (aux != 0) aux--; resolvia...

Uma outra coisa se fosse para fazer algo bem feitinho seria um if que apenas passa-se para a string caracteres alfanuméricos, pois se ao inserir a pass carregares numa seta, ou noutra tecla qualquer vai inserir o caracter na string..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Nem tinha pensado no último caso que deste.

Mas também foi só para se perceber aquele caso de apagar.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.