2012-02-15 72 views
9

我正在用C++編寫一個程序,我應該從用戶那裏接收一個字符串而不在屏幕上顯示它(例如:apassword)。我嘗試使用cingets接受字符串。但兩者都會回顯用戶在控制檯中輸入的字符。C++中的未輸入字符串輸入

那麼是否有任何功能或任何其他方式在C++中做到這一點?

+0

和你在開始的帖子被自動刪除! – ZoomIn 2012-02-15 11:12:30

+0

是的,這是一件好事:我們試圖在這裏保留問題(和答案)。不使用「你好」和「謝謝」在堆棧溢出時不被認爲是不禮貌的。無論如何,有一個upvote,很好的問題。 – 2012-02-15 11:14:20

+1

檢出* NCurses *(unix)和* PDCurses *(windows)。 – 2012-02-15 11:16:54

回答

3

如何避免通過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); 
} 

也許可以用來切換標準輸入回波。

+0

在windows系統上,它的工作方式就像魅力一般!現在試着用gcc-linux getpass。 – ZoomIn 2012-02-15 11:40:53

+1

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

3

C++標準沒有定義一個機制來做到這一點。你必須依賴平臺特定的庫。例如用gcc/glibc的使用getpass

http://www.gnu.org/software/libc/manual/html_mono/libc.html#getpass

可能有其他庫,抽象的這些功能,並提供了一個平臺獨立包裝。

+0

不需要一個完整的庫,'tcsetattr'通常足以應付。 glibc「getpass」的手冊頁甚至說:「此功能已過時,請勿使用它。」 – PlasmaHH 2012-02-15 12:31:43

+0

是的tcsetattr足以做到gcc。 – ZoomIn 2012-02-15 13:34:52

2

這不是一個C++,iostream等問題 - 它特定於您正在使用的終端。

請參閱this question獲得想法,然後問一個特定於您的終端的問題,如果它沒有覆蓋那裏,並且您不能使用ncurses。