2011-08-01 228 views
12

可能重複:
Read a password from std::cin隱藏密碼用戶輸入提示

我不與控制檯正常工作,所以我的問題是,也許很容易回答的問題或不可能做。

是否可以「去耦」cincout,以便我在控制檯中輸入的內容不會再直接出現在控制檯中?

我需要這個讓用戶輸入密碼,我和用戶通常都不希望他的密碼出現在屏幕上的plaintext

我試過在上使用std::cin.tie,但我輸入的所有內容仍然在控制檯中被鏡像。

+0

另請參閱:https://github.com/Seldaek/hidden-input – mauris

回答

29

How to Hide Text

的Windows

#include <iostream> 
#include <string> 
#include <windows.h> 

using namespace std; 

int main() 
{ 
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD mode = 0; 
    GetConsoleMode(hStdin, &mode); 
    SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT)); 

    string s; 
    getline(cin, s); 

    cout << s << endl; 
    return 0; 
}//main 

清理:

SetConsoleMode(hStdin, mode); 

tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 

Linux的

#include <iostream> 
#include <string> 
#include <termios.h> 
#include <unistd.h> 

using namespace std; 

int main() 
{ 
    termios oldt; 
    tcgetattr(STDIN_FILENO, &oldt); 
    termios newt = oldt; 
    newt.c_lflag &= ~ECHO; 
    tcsetattr(STDIN_FILENO, TCSANOW, &newt); 

    string s; 
    getline(cin, s); 

    cout << s << endl; 
    return 0; 
}//main 
+2

'tcsetattr(STDIN_FILENO,TCSANOW,&oldt);'也需要在Linuz進行清理。 –

2

使用getch()得到輸入,而不是使用cin,所以輸入將不被顯示(引用維基):

INT的getch(無效)直接從控制檯中讀取一個字符,而不 緩衝器,和沒有回聲。

這真的是C而不是C++,但它可能適合你。

此外,這裏有another link

5

你真的在問兩個不相關的問題。
調用cin.tie(NULL) decouples std::cinstd::cout 完全。但它不會影響到較低級別的任何內容。至少在Windows和Unix下,至少在Windows和Unix下,std::cinstd::cout都連接到系統級的同一個設備,它就是該設備(在Unix下爲/dev/tty),它進行回顯;您甚至可以將標準重定向到文件,並且控制檯仍然會回顯輸入。

如何關閉此回顯取決於系統;最簡單的解決方案可能是使用某種第三方庫,如curses或ncurses,它提供更高級別的接口,並隱藏所有系統依賴關係。

相關問題