我正在用C++編寫一個程序,我應該從用戶那裏接收一個字符串而不在屏幕上顯示它(例如:apassword)。我嘗試使用cin
和gets
接受字符串。但兩者都會回顯用戶在控制檯中輸入的字符。C++中的未輸入字符串輸入
那麼是否有任何功能或任何其他方式在C++中做到這一點?
我正在用C++編寫一個程序,我應該從用戶那裏接收一個字符串而不在屏幕上顯示它(例如:apassword)。我嘗試使用cin
和gets
接受字符串。但兩者都會回顯用戶在控制檯中輸入的字符。C++中的未輸入字符串輸入
那麼是否有任何功能或任何其他方式在C++中做到這一點?
如何避免通過cin
讀取的數據在控制檯上顯示取決於控制檯;這當然依賴於操作系統。
在Windows上,您可以使用SetConsoleMode
函數來啓用/禁用任何文件句柄的回顯,包括標準輸入句柄。
喜歡的東西
void enableStdinEcho(bool b) {
HANDLE hStdin = ::GetStdHandle(STD_INPUT_HANDLE);
DWORD mode = 0;
::GetConsoleMode(hStdin, &mode);
if (b) {
mode |= ENABLE_ECHO_INPUT;
} else {
mode &= ~ENABLE_ECHO_INPUT;
}
::SetConsoleMode(hStdin, mode);
}
也許可以用來切換標準輸入回波。
在windows系統上,它的工作方式就像魅力一般!現在試着用gcc-linux getpass。 – ZoomIn 2012-02-15 11:40:53
void enableStdinEcho(bool b){ \t int ttyDevice = STDOUT_FILENO; struct termios termAttributes; /*確保文件描述符適用於TTY設備。 */ if(!isatty(ttyDevice)){exit(1); \t}否則{ \t如果(tcgetattr(ttyDevice,&termAttributes)!= 0){ \t \t \t \t出口(1); \t \t \t}否則{ \t \t \t \t如果(B == FALSE) \t \t \t \t \t termAttributes。c_lflag&=〜ECHO; \t \t \t \t其他 \t \t \t \t \t termAttributes.c_lflag | = ECHO; \t \t \t \t \t \t \t \t tcsetattr(ttyDevice,TCSANOW,&termAttributes); \t \t \t} \t} }相當於在unix/linux based.Got這東西工作。 – ZoomIn 2012-02-15 13:32:49
C++標準沒有定義一個機制來做到這一點。你必須依賴平臺特定的庫。例如用gcc/glibc的使用getpass
http://www.gnu.org/software/libc/manual/html_mono/libc.html#getpass
可能有其他庫,抽象的這些功能,並提供了一個平臺獨立包裝。
這不是一個C++,iostream等問題 - 它特定於您正在使用的終端。
請參閱this question獲得想法,然後問一個特定於您的終端的問題,如果它沒有覆蓋那裏,並且您不能使用ncurses。
和你在開始的帖子被自動刪除! – ZoomIn 2012-02-15 11:12:30
是的,這是一件好事:我們試圖在這裏保留問題(和答案)。不使用「你好」和「謝謝」在堆棧溢出時不被認爲是不禮貌的。無論如何,有一個upvote,很好的問題。 – 2012-02-15 11:14:20
檢出* NCurses *(unix)和* PDCurses *(windows)。 – 2012-02-15 11:16:54