Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ricardo_1977

Login com asteriscos

Recommended Posts

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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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...

Share this post


Link to post
Share on other sites
Localhost

kingpito, e se a pessoa der um backspace porque se enganou na password ;)


here since 2009

Share this post


Link to post
Share on other 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 ;))

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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  ;)

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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..

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

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

×

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.