Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Myho

Mascarar entrada de dados

Recommended Posts

E aew pessoal, to com um probleminha aqui... Criei um jogo da forca e ele ta rodando beleza, mas eu gostaria q quando a pessoal digitasse a palavra secreta, ela nao aparecesse na tela, q aparecesse uma mascara, igual quando digitamos uma senha.Palavra secreta : *******entendem?Eu nao tenhu a menor ideia de por onde começar.. nao sei se tem uma lib pra isso, ou se tenhu q criar. Quem puder ajudar agradeço, pelo menos com umas dicas =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, eu tava pensando em edita isso pra por mais detalhes, vamos la:Uso o compilador Dev-cpp 4.9.9.2, mas a resposta tb pode ser para Visual C++ 2003, uso os dois.E seria uma CONSOLE APPLICATIONAchu que o resto esta claro, mas eu vo tenta explicar melhor.Supondo q 2 pessoas estejam jogando uma contra a outra o jogo da forca no mesmo PC, eu quero q quando alguem for digitar a palavra a ser adivinhada, ela nao ficasse na tela até dar ENTER, q aparecesse alguma mascara, tipo '*', ou espaço em branco mesmo. Queria esconder o q esta sendo digitado mesmo, igual quando digitamos uma senha.Pensei em usar uma variavel char, q armazenasse em um vetor através do getch e mostrasse na tela um outra char de mascara, mas teria q criar uma função caso o BACKSPACE seja pressionado... posso até criar, mas se alguem tem sabe um modo mais simples agradeço.(achu q confundi mais ainda... )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mudando de idéia...

#include "stdafx.h"#include <conio.h>#include <stdio.h>#include <windows.h> void RetornaInicioLinha();int main(int argc, char* argv[]){ char cPalavra[30] = {0}; char cAst[30]={0}; int iTecla = getch(); int iInd = 0; while(iTecla != 13) { if(iTecla == 8)//BackSpace { iInd--; cPalavra[iInd] = 0; cAst[iInd]=0; } else { cPalavra[iInd] = (char)iTecla; cAst[iInd]='*'; iInd ++; } RetornaInicioLinha();//Retorna ao inicio da linha para limpar a linha printf(" ", cAst);//Limpa a linha, hehehe chuncho RetornaInicioLinha();//Retorna ao inicio da linha printf("%s", cAst);//Imprime os * iTecla = getch(); } return 0;}void RetornaInicioLinha(){ HANDLE hStdout; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_SCREEN_BUFFER_INFO csbiInfo; if (! GetConsoleScreenBufferInfo(hStdout, &csbiInfo)) printf("GetConsoleScreenBufferInfo"); csbiInfo.dwCursorPosition.X = 0; if (! SetConsoleCursorPosition(hStdout, csbiInfo.dwCursorPosition)) { printf("SetConsoleCursorPosition"); }}

Acho que agora vai servir para você. Ao menos a lógica e as funções são essas. (console)Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Po cara, vlw mesmo por ajudar. Eu acabei criando uma rotina propria mesmo, mas concerteza sera muito util esse seu codigo, vi q posso da uma enxugada no meu. Alguns comandos q voce utilizou nunca tinha visto, aqueles dentro da função RetornaInicioLinha() e nem poderia usalos, trabalho de 1º semestre tem q fica nos comandos basicos mesmo.

Vo posta o meu, caso voce (ou qualquer outra pessoa q queira ajudar ^^) tenha ideias pra deixa-lo mais enxuto, ou mais claro, estou aceitando.

 

 

****** Sempre lembrando q tem esse bug louco do forum, q ele nao aceita q se digite 'barra zero' no codigo, entao onde você ve '\' entenda '\ 0' soh q sem o espaço entre eles*****

 

int shadow(char *p)	  // recebe um ponteiro de char, para modificar a palavra dentro do main{	char resp[50];	int i = 0;	resp[0] = '\';			while (resp[i-1] != 13)   // Enquanto nao apertar ENTER	{		  cout << "Digite a palavra secreta: ";		  for (int j = 0; j < i; j++)		  {			 cout << (char)219; // aqui é o carcter q eu escolhi para mostras, poderia ser '*' pra ficar tipo senha		  }		  		  resp[i] = getch();		  resp[i+1] = '\';												   // sempre colocando um '\ 0' na proxima posição do vetor (sem isso deu bug loco aqui)		  if (((resp[i] >= 48) && (resp[i] <= 57)) || 			  ((resp[i] >= 65) && (resp[i] <= 90)) ||			  ((resp[i] >= 97) && (resp[i] <= 122))||  // esse bando de condição é pra soh permitir Letra e Numeros (ideias pra melhorar?)			  (resp[i] == 13) || (resp[i] == 8))		  { 			 system("cls");			 if (resp[i] == 8)			 {				if (i > 0 ) {  i-=1; resp[i] =' ';i-=1;}  // se a tecla for BACKSPACE, apaga e volta uma posição				else { i = -1;} 				system("cls");		   			 }		  			 i++;		  }		  else { system("cls");}			} 	resp[i-1] = '\';				   //coloca um '\ 0' de na ultima posição (fico feio esse monte de \ 0, mas soh assim q funciono ¬¬	strcpy(p,resp);   // passa a palavra secreta pro vetor no MAIN

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa... sem problemas amigo, o problema do "system("cls")", é que ele limpa a tela inteira. E com o SetConsoleCursorPosition você controla o buffer e limpa ou altera onde quiser.Valeu. Qualquer coisa estamos ai.Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.