C++ console aplication

XeniX

Power Member
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".
 
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... [[]]
 
Se fosse para escrever e com um comando aparecer escrito "****" arranja-se, mas dinamicamente não faço ideia...
 
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
 
Heyas all...

HecKel disse:
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:

Código:
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 [[]]
 
Última edição:
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:
 
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:
 
Back
Topo