View Full Version : C++ console aplication
Como posso fazer com que o input apareça em asteriscos?
Tipo ao escrever "1234" aparecer "****"
Alguém sabe?
Não é urgente, apenas uma pesquisa que estou a fazer para "evoluir".
gnomoamorim 25-07-2005, 23:36 Eu na tenho 100% de certeza... mas...
Sendo um programa para correr na linha de comandos penso que não tens hipotese de fazer isso, pois o cmd não deixa de ser um programa que em mostra uma tecla que seja actuada e sabe realizar determinadas operações.
Para teres o resultado que queres terias de fazer a tua propria consola com as especificações que desejas. Para isto ja tens que entrar com modo grafico.
Sem mais... [[]]
destr0yer 25-07-2005, 23:47 Se fosse para escrever e com um comando aparecer escrito "****" arranja-se, mas dinamicamente não faço ideia...
incognito54 26-07-2005, 00:18 estive a ler umas coisas sobre ncurses outro dia e acho q dá para isso... agora só assim c++ n sei
Bem..., tenho aqui uma solução de desenrasque, experimenta fazeres o seguinte:
- Ao identificar cada caracteres inserido guardar esse valor
- Fazer clear screen
- Inserir tantos asteriscos como o tamanho da string guardada
Isto será dentro de um ciclo até encontrar um return(enter), basicamente isto não te altera o display..., apenas tenta camuflar, provavelmente podes ter uns problemas em casos como backspace..., etc e tal, mas nada como tentar prever essas situações....
Volto a repetir, isto é um desenrasque, basicamente é uma "má programação"....
um abraço, HecKel
Lancaster 26-07-2005, 02:05 Heyas all...
Bem..., tenho aqui uma solução de desenrasque, experimenta fazeres o seguinte:
- Ao identificar cada caracteres inserido guardar esse valor
- Fazer clear screen
- Inserir tantos asteriscos como o tamanho da string guardada
Isto será dentro de um ciclo até encontrar um return(enter), basicamente isto não te altera o display..., apenas tenta camuflar, provavelmente podes ter uns problemas em casos como backspace..., etc e tal, mas nada como tentar prever essas situações....
Volto a repetir, isto é um desenrasque, basicamente é uma "má programação"....
um abraço, HecKel
Primeiro...não é má programação :P é o desenrascanço português a trabalhar nas horas :P (joking)..
Em relação ao problema mesmo dito..agora que vi a tua resposta Heckel, que tal se ele ler caracter a caracter, e em cada caracter lido ele mandar um backspace para a console, e depois um *? O backspace deve ter código ASCII, assim já não era preciso limpar o ecrãn todo...a mim parece-me bem...mas não testei...
Bastava um while dentro de uma coisa deste género:
while(;;)
{
char x = readchar();//Não me perguntem a sintaxe correcta a estas horas..pensem em pseudo código..
switch (x):
case (backspace):
anda para trás e apaga o char do sítio onde está guardado;
case (enter):
finaliza;
case (uma tecla qq):
{
guarda o char num sítio qq;
faz um backspace;
escreve o *
}
default:
não faz nada e deixa-se andar.
}
Que acham?
Hasta all [[]]
CoolZero 26-07-2005, 09:52 Akilo q tu keres eviar chama-se "echo", ou seja, carregas numa tecla, ela é enviada para o teu programa que por sua vez, automaticamente, envia o eco para o ecrã e assim vês a tecla que primiste.
http://www.codeguru.com/forum/archive/index.php/t-139472.html
Se isso não funcionar procura como fazer "disable" ao echo na windows console
Que acham?
Hasta all [[]]
Punha no default o que está naquele case(uma tecla qq).
CrazyBomber 26-07-2005, 21:09 Bolas, isto é mm desenrascanso!
A melhor maneira é fazeres o teu proprio readLine() ou qq coisa parecida.
Eu já fiz isso há 2 anos, praí, para ADA, pq o scanf() não tava a funcionar bem, então fizemos a nossa própria função :)
Há de haver outra função para ler cada char do input, sem o escrever. Não me lembro qual é (vê o stdio.h), mas é só fazeres uma função que vai adicionando chars até encontrar um newline.
Na minha versão mandavamos imprimir o char recebido, na tua mandas imprimir um * e já está :)
Posso ir investigar mais sobre isso, se não te desenrascares. Devo ter o trabalho algures por aki...
EDIT: só agora reparei que o Lancastar já tinha postado esta solução. ops :sad:
sapropel 26-07-2005, 21:21 usando standard C ou C++ isso não é possivel. usas a função getch() que recebe input do teclado mas não escreve para o standard output. essa função em windows esta disponivel na biblioteca conio (disponivel em praticamente todos os compiladores) e em *nix na biblioteca ncurses.
aqui vai o código para o que queres:
#include <iostream>
#include <string>
#include <conio.h>
int main( int argc, char ** argv )
{
std::string password;
char c;
while( (c = getch()) != '\r' )
{
password += c;
std::cout << "*";
}
std::cout << std::endl << "a password inserida e: " << password << std::endl;
return 0;
}
e prontos..
Muito obrigado a todos! Eu vou tentar o que vocês sugeriram, mas só lá para sábado é que vou poder tentar(tou sem compilador, fiz asneira sem me aperceber (debug ao microsoft visual studio) e aquilo começou a dar erros. O pior é que eu tive de apagar o programa e não tinha o ficheiro instalável. O meu irmão vai trazê-lo esta semana (se é que ainda o tem, mas ele conhece tipos em L.E.S.I. que devem tê-lo).
Bem , mas apesar desta confusão toda vou tentar: se der dá s não der obrigado na mesma a todos vocês!!!
:001: :001: :001: :001:
|
|