2010-04-14 125 views
10

我知道在您輸入標準ANSI C時不可能回顯*。但是有沒有辦法在控制檯中輸入密碼時顯示任何內容。我的意思是像Unix/Linux終端中的sudo提示符。就像輸入以下命令一樣:sudo cp /etc/somefile ~/somedir。通常會提示您輸入root密碼。當你輸入時,終端不顯示任何內容。這個效果在C中可能嗎?如果是,如何?在C中輸入密碼

+0

關於顯示「*」有什麼不可能?的printf( 「*」);會做的。 – 2010-04-14 00:54:53

+0

@彼得K .:我相信他指的是所有標準輸入函數都會迴應到控制檯。當然,您可以打印*,但用戶輸入的字符已經存在。 – 2010-04-14 00:55:57

+0

可能的重複http://stackoverflow.com/questions/1196418/getting-a-password-in-c-without-using-getpass-3 – 2010-04-14 01:00:42

回答

8

您正在查找的功能是:getpass()。但是,您會注意到它被標記爲「LEGACY」。雖然它不會去任何地方,但該函數不允許指定輸入緩衝區的大小,這使得它不是一個非常好的接口。 Jeutti指出,glibc手冊提供portable example code for implementing getpass from scratch允許任意輸入大小(而不是LEGACY)。

+0

他們應該提供'getnpass()',所以不是每個程序員都需要重新發明輪子... – Calmarius 2013-12-03 12:57:02

0

*這不是ANSI C(感謝比利)樣品

可以檢測與_kbhit(按鍵),然後獲取的應用價值_getch()。 這兩個函數都不會在屏幕上回顯內容。

#include <conio.h>   //For keyboard events 
#include <stdio.h>   //Include this or iostream 
#include <locale>   
int main() 
{ 
    bool bContinue = true; 
    char szBuffer[255] = {0}; 
    unsigned int nbufIndex = 0; 
    while (bContinue) 
    { 
     if (_kbhit()) 
     { 
      szBuffer[nbufIndex] = _getch(); 
      if (szBuffer[nbufIndex] == 0xD) 
      { 
       bContinue = false; 
      } 
      else 
      { 
       ++nbufIndex; 
       printf("*"); 
      } 
     } 
    } 
    printf("\n%s\n", szBuffer); 
    return 0; 
} 
+0

請注意,這不是ANSI C. – 2010-04-14 01:08:00

+1

我不認爲'conio.h'可能可用,在UNIX或Linux上重新編譯。 – 2010-04-14 01:11:28

0

的,窮人的這樣做的方法是通過讀取用戶輸入的字符字符,並且在接收到每個字符後,打印出退格字符後跟*。輸出在技術上被髮送到控制檯,但它會立即被刪除並被星號覆蓋(通常在該幀甚至被拖到屏幕上之前)。請注意,這不是一種真正安全的方法,並且存在一些安全漏洞,但對於低技術含量的低安全性應用程序而言,它很有用。