Hay dos métodos en los que la entrada se puede tomar de una manera más segura:
- No mostrar ningún contenido.
- Muestre un carácter especial como un asterisco en lugar del contenido real.
En este método, el contenido de entrada será invisible. Esto se puede implementar de dos maneras:
usando <windows.h> :
Programa 1:
A continuación se muestra el programa donde el modo de consola está configurado para habilitar, hacer eco de entrada y restablecer el modo de consola:
C++
// C++ program to take the input // invisibly #include <iostream> #include <windows.h> using namespace std; // Function take password and // reset to console mode std::string takePasswdFromUser() { HANDLE hStdInput = GetStdHandle(STD_INPUT_HANDLE); DWORD mode = 0; // Create a restore point Mode // is know 503 GetConsoleMode(hStdInput, &mode); // Enable echo input // set to 499 SetConsoleMode( hStdInput, mode & (~ENABLE_ECHO_INPUT)); // Take input string ipt; getline(cin, ipt); // Otherwise next cout will print // into the same line cout << endl; // Restore the mode SetConsoleMode(hStdInput, mode); return ipt; } // Driver Code int main() { string input; cout << "@root>>> "; // Function Call input = takePasswdFromUser(); // Print the input cout << input << endl; }
Producción:
usando < conio.h > :
Para esto se usa getch() . Esta función toma una entrada de carácter del usuario sin búfer y no espera a que el usuario presione la tecla «retorno».
Programa 2:
A continuación se muestra el programa C++ para demostrar el uso de getch() en conio.h:
C++
// C++ program to demonstrate the // use of getch() #include <conio.h> #include <iostream> using namespace std; // Function using getch() std::string takePasswdFromUser() { string ipt = ""; char ipt_ch; while (true) { ipt_ch = getch(); // Check whether user enters // a special non-printable // character if (ipt_ch < 32) { cout << endl; return ipt; } ipt.push_back(ipt_ch); } } // Driver Code int main() { string input; cout << "@root>>> "; // Function call input = takePasswdFromUser(); cout << input << endl; }
Producción:
Inconveniente: el usuario no puede borrar la respuesta realizada anteriormente. Cuando se presiona la tecla de retroceso , se devuelve la entrada.
Programa 3:
A continuación se muestra el programa C++ para demostrar la solución al inconveniente anterior:
C++
// C++ program to demonstrate the // solution of above drawback #include <conio.h> #include <iostream> using namespace std; // Enumerator enum TT_Input { // ASCII code of backspace is 8 BACKSPACE = 8, RETURN = 32 }; // Function accepting password std::string takePasswdFromUser() { string ipt = ""; char ipt_ch; while (true) { ipt_ch = getch(); if (ipt_ch < TT_Input::RETURN && ipt_ch != TT_Input::BACKSPACE) { cout << endl; return ipt; } // Check whether the user // pressed backspace if (ipt_ch == TT_Input::BACKSPACE) { // Check if ipt is empty or not if (ipt.length() == 0) continue; else { // Removes last character ipt.pop_back(); continue; } } ipt.push_back(ipt_ch); } } // Driver Code int main() { string input; cout << "@root>>> "; // Function call input = takePasswdFromUser(); cout << input << endl; }
Ocultar la contraseña por un carácter especial (*) :
La idea es usar la biblioteca <conio.h> aquí para ocultar la contraseña con asterisco (*) . A continuación se muestra el programa C++ que usa conio.h para ocultar la contraseña usando *:
Programa 4:
C++
// C++ program to hide the password // using *(asterik) #include <conio.h> #include <iostream> using namespace std; // Enumerator enum IN { // 13 is ASCII for carriage // return IN_BACK = 8, IN_RET = 13 }; // Function that accepts the password std::string takePasswdFromUser( char sp = '*') { // Stores the password string passwd = ""; char ch_ipt; // Until condition is true while (true) { ch_ipt = getch(); // if the ch_ipt if (ch_ipt == IN::IN_RET) { cout << endl; return passwd; } else if (ch_ipt == IN::IN_BACK && passwd.length() != 0) { passwd.pop_back(); // Cout statement is very // important as it will erase // previously printed character cout << "\b \b"; continue; } // Without using this, program // will crash as \b can't be // print in beginning of line else if (ch_ipt == IN::IN_BACK && passwd.length() == 0) { continue; } passwd.push_back(ch_ipt); cout << sp; } } // Driver Code int main() { string input; cout << "@root>>> "; // Function call input = takePasswdFromUser(); cout << input << endl; }
Publicación traducida automáticamente
Artículo escrito por mohdatishanx y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA