#define MAX_PW_LENGTH 12
char pwd[MAX_PW_LENGTH + 1];
/** Get Password
*
* \return True on success, false on failure (EOF, too long).
*/
bool getPwd(void)
{
size_t idx;
char ch;
for (idx = 0 ; idx < sizeof(pwd) - 1 ; idx++) {
ch = getchar();
if ((ch == EOF) || (ch == '\n') || (ch == '\r'))
break;
pwd[i] = ch;
}
pwd[i] = `\0`;
return (ch == `\r`) || (ch == '\n'); // might depend on OS what return-key yields
}
注意我用getchar作爲殘培是非標準和(IIRC)不會等待輸入,而是立即返回(非阻塞)。哦,我實際上do不輸出任何東西,因爲getchar需要整行輸入第一個(緩衝 - 見下文)。問題是:控制檯默認輸入字符作爲輸入(另見:見下文)。所以,你需要非回聲輸入;其餘的將會很好。
好的,我試圖提供一個簡單的解決方案。但是,至少對於Linux而言,默認情況下,getchar()
有兩個主要缺點:終端默認回顯所有輸入,因此鍵入時顯示密碼。其次,它在輸入行在getchar()中返回char-by-char之前緩衝輸入行。
第一個顯然是一個殺手 - 反特徵,而第二個只禁止迴響星星或類似的東西(我反而勸阻)。但是,使用termios可以禁用控制檯的兩個功能;只是谷歌這一點。
另一種方法是使用提供getch()和一個簡單的'noecho()'調用來禁用此行爲(和cbreak()來禁用緩衝)的ncurses。但是,這似乎需要使用TUI功能,並且不能像普通的控制檯輸入一樣使用(但仍比termios更簡單)。
結論:使用系統的功能獲取密碼/認證。彷彿沒有這已經知道:-)
這裏是一個ncurses的版本:
#include <ncurses.h>
bool getPwd(void)
{
// this should be done in main() or so only once
initscr(); noecho(); cbreak();
size_t idx;
char ch;
for (idx = 0 ; idx < sizeof(pwd) - 1 ; idx++) {
// wait for input
while (ERR == (ch = getch())) ;
if (ch == '\n')
break;
addch('*'); // this should actually be disabled
pwd[i] = ch;
}
pwd[i] = `\0`;
return ch == '\n'; // might depend on OS what return-key yields
}
}
結案。
這是os和終端依賴器。咒語庫unix –
'我'初始化了什麼地方? –
自己讀取密碼可能會造成安全漏洞。您可能會考慮使用操作系統服務(Linux上的PAM以及Windows提供的任何服務)。這有很多額外的優勢,如使用自動替代認證等。 – Olaf