我不與控制檯正常工作,所以我的問題是,也許很容易回答的問題或不可能做。
是否可以「去耦」cin
和cout
,以便我在控制檯中輸入的內容不會再直接出現在控制檯中?
我需要這個讓用戶輸入密碼,我和用戶通常都不希望他的密碼出現在屏幕上的plaintext
。
我試過在上使用std::cin.tie
,但我輸入的所有內容仍然在控制檯中被鏡像。
我不與控制檯正常工作,所以我的問題是,也許很容易回答的問題或不可能做。
是否可以「去耦」cin
和cout
,以便我在控制檯中輸入的內容不會再直接出現在控制檯中?
我需要這個讓用戶輸入密碼,我和用戶通常都不希望他的密碼出現在屏幕上的plaintext
。
我試過在上使用std::cin.tie
,但我輸入的所有內容仍然在控制檯中被鏡像。
的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
'tcsetattr(STDIN_FILENO,TCSANOW,&oldt);'也需要在Linuz進行清理。 –
使用getch()
得到輸入,而不是使用cin
,所以輸入將不被顯示(引用維基):
INT的getch(無效)直接從控制檯中讀取一個字符,而不 緩衝器,和沒有回聲。
這真的是C而不是C++,但它可能適合你。
此外,這裏有another link。
你真的在問兩個不相關的問題。
調用cin.tie(NULL)
decouples std::cin
和std::cout
完全。但它不會影響到較低級別的任何內容。至少在Windows和Unix下,至少在Windows和Unix下,std::cin
和std::cout
都連接到系統級的同一個設備,它就是該設備(在Unix下爲/dev/tty
),它進行回顯;您甚至可以將標準重定向到文件,並且控制檯仍然會回顯輸入。
如何關閉此回顯取決於系統;最簡單的解決方案可能是使用某種第三方庫,如curses或ncurses,它提供更高級別的接口,並隱藏所有系統依賴關係。
另請參閱:https://github.com/Seldaek/hidden-input – mauris