Obtener password en C

D

¿Como podria hacer para obtener una cadena de texto con gets, pero que en la pantalla solo aparezcan asteriscos al escribirla?

Gracias...

cabron

Necesitas una función que te permita obtener el caracter pulsado sin que se muestre en pantalla, y poner tú los *. Ninguna función del estándar de C hace eso, tendrás que mirar las funciones de entrada y salida que trae el compilador.

Soltrac

Con C puro y duro? Pues es complicado, por no decirte imposible ,ya que al no tener programacion por eventos, no puedes calcular cuando un usuario presiona una tecla.

Quizas se pueda, lo pensare ta tarde y si se me ocurre algo posteare :)

RikuTheRonin

Ahora mismo... no se me ocurre nada, pero lo que puedes hacer es, leer los caracteres uno a uno, meterlos en un string, y cada vez que metas uno, que imprima en pantalla un *

Como te ha dicho #3, si luego estoy aburrido intento hacerlo y te lo paso xD

javithelong

Si no necesitas ANSI C, en conio.h, habia una funcion... getc o getch (no recuerdo cual) que lee un caracter sin mostrarlo por pantalla, igual te sirve.

Lee caracteres hasta tener un "enter" y vete escribiendo asteriscos con un printf o similar.

Saludos

LOc0

Lo hice hace bastante:


#include <stdio.h>
#include <string.h>
#include <conio.h>

int main()
{
char nick[20];
char pass[20];
printf("\n\tNick: ");
gets(nick);
printf("\n\tPass: ");
int conta=0;
int i=0;


while(pass[i]!=13)
{
    pass[i]=getch();
    
    if(pass[i]>32 && i<20)
            {
              putchar('*');
              i++;
            }
    else if(pass[i]==8 && i>0)
            {
              putchar(8);
              putchar(' ');
              putchar(8);
              i--;  
            }
               
}

pass[i]='\0';

if(strcmp(pass, "LAQUESEA")==0)
    printf("\n\n\n\n\n\t\tACCESO PERMITIDO");
else
    printf("\n\n\n\n\n\t\t**ACCESO DENEGADO**");

return 0;
}

[/i]

Salu2 ;)

SeiYa

Calla calla calla que si que se puede eh gente XD 1 seg ...

Toma:

getch - Funcion de la libreria conio.h en C ANSI y de Borland - Lee un solo carácter directamente desde el teclado, sin mostrar tal carácter en pantalla.

getch();

Haces un algo así:

while(getch()!='\n') ... o como quieras

Prueba que a veces tenías que coger el caracter en una variable char y no se que historias...

Funciona que yo la usé para hacer pruebas de "Desea continuar S/N" si usabas otra llenaba la pantalla de teclas XD

Un saludo ;)

(Existe la equivalente en ensamblador, no se que interrupción era pero no viene al caso XD)

javithelong

Tenia entendido que conio.h no era ansi, sino libreria de borland :s

D

#6 ya esta lo tuyo funciona perfectamente, eliminando la variable conta que no la usas para nada...

cabron

conio.h no es ANSI C, esa extensión la llevan casi todos los compiladores, pero no es parte de estándar.

aLeX

Uy el gets, que peligrosa es esa función.

LoRTH

aLeX, siempre me da un warning al compilar, por el gets, porque es tan peligrosa? como curiosidad...

cabron

#12:

No hay forma de comprobar que la cadena de texto introducida en consola cabe en en el array donde se va almacenar, y si la cadena es más larga es evidente que peta.

LoRTH

Merci.

Y otra duda, porque es un problema, o no, que conio.h no este definida en ANSI C, si esta en la mayoria de compiladores?

cabron

#14:

Lo que está definido por ANSI C es lo único que está 100% asegurado que va a funcionar en un compilador compatible con el estándar.

Todo lo que se salga del estándar solo funciona con determinados compiladores, aunque como ya se ha dicho, conio.h lo llevan prácticamente todos.

javithelong

Como solucion al gets, pon fgets (que tiene máximo de caracteres) de stdin (entrada standard, osea teclado)

Suponiendo aux un array de caracteres, de tamaño mayor o igual a MAX_AUX:

gets (aux);
y
fgets (aux, MAX_AUX, stdin);

Hacen lo mismo, solo que fgets no puede petar por overflow.

Saludos

Usuarios habituales