View Full Version : C++ console aplication


XeniX
25-07-2005, 23:01
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

HecKel
26-07-2005, 01:16
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

nothing
26-07-2005, 10:07
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..

XeniX
28-07-2005, 11:05
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: