2010-04-14 46 views
10

Tôi biết rằng không thể lặp lại * trong khi bạn nhập tiêu chuẩn ANSI C. Nhưng có cách hiển thị không có gì trong khi ai đó đang nhập mật khẩu của họ trong bảng điều khiển. Những gì tôi có nghĩa là giống như sudo nhắc nhở trong một thiết bị đầu cuối Unix/Linux. Giống như nếu bạn gõ lệnh: sudo cp /etc/somefile ~/somedir. Bạn thường được nhắc nhập mật khẩu gốc. Và trong khi bạn gõ nó vào, thiết bị đầu cuối sẽ không hiển thị gì cả. Có hiệu ứng này trong C? Nếu có, làm thế nào?Nhập Mật khẩu vào C

+0

Không thể hiển thị "*"? printf ("*"); sẽ làm điều đó. –

+0

@Peter K .: Tôi tin rằng anh ấy đang đề cập đến thực tế là tất cả các chức năng đầu vào tiêu chuẩn đều tương tự như giao diện điều khiển. Chắc chắn, bạn có thể in *, nhưng ký tự mà người dùng đã nhập đã có sẵn. –

+0

có thể trùng lặp http://stackoverflow.com/questions/1196418/getting-a-password-in-c-without-using-getpass-3 –

Trả lời

8

Chức năng mà bạn đang tìm kiếm là: getpass(). Tuy nhiên, bạn sẽ lưu ý rằng nó được đánh dấu là "LEGACY". Mặc dù nó sẽ không đi đâu cả, nhưng chức năng này không cho phép kích thước của bộ đệm đầu vào được chỉ định, mà làm cho nó không phải là một giao diện rất tốt. Như Jefromi đã lưu ý, hướng dẫn sử dụng glibc cung cấp portable example code for implementing getpass from scratch theo cách cho phép kích thước đầu vào tùy ý (và không phải là LEGACY).

+0

Họ nên cung cấp một 'getnpass()' vì vậy không phải mọi lập trình viên cần phải tái tạo lại bánh xe ... – Calmarius

0

* Đây không phải là ANSI C (Cảm ơn Billy) mẫu

Bạn có thể phát hiện phím nhấn với _kbhit(), sau đó có được giá trị sử dụng _getch(). Cả hai chức năng sẽ không lặp lại nội dung trên màn hình.

#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

Lưu ý rằng đây không phải là ANSI C. –

+1

Tôi không nghĩ rằng 'conio.h' có khả năng có sẵn nếu bạn ' biên dịch lại trên UNIX hoặc Linux. –

0

Phương pháp này kém của con người để làm điều này là để đọc kí tự đầu vào người dùng bằng cách ký tự, và sau mỗi ký tự được nhận, in ra một ký tự backspace theo sau là *. Đầu ra là kỹ thuật được gửi đến giao diện điều khiển, nhưng nó ngay lập tức bị xóa và ghi đè bởi một dấu sao (thường trước khi khung đó thậm chí được rút ra màn hình). Lưu ý rằng đây không thực sự là một phương pháp an toàn và có một số lỗ hổng bảo mật, nhưng đối với các ứng dụng bảo mật thấp công nghệ thấp, nó hoạt động.

Các vấn đề liên quan