2012-02-15 28 views
9

Tôi đang viết một chương trình trong C++, nơi tôi được yêu cầu nhận chuỗi từ người dùng mà không hiển thị nó trên màn hình (ví dụ: apassword). Tôi đã thử sử dụng cingets để chấp nhận chuỗi. Nhưng cả hai sẽ lặp lại các ký tự được người dùng nhập trong bảng điều khiển.Đầu vào chuỗi chưa được tạo sẵn trong C++

Vậy có chức năng nào hay cách nào khác để thực hiện trong C++?

+0

và Chào khi bắt đầu bài đăng được xóa tự động! – ZoomIn

+0

Có, và đó là một điều tốt: chúng tôi cố gắng giữ các câu hỏi (và câu trả lời) cho vấn đề ở đây. Không sử dụng "Hi" và "cảm ơn" là * không * được coi là bất lịch sự trên Stack Overflow. Dù sao, có một câu hỏi hay, tốt. –

+1

xem * NCurses * (unix) và * PDCurses * (cửa sổ). –

Trả lời

3

Cách tránh dữ liệu được đọc qua cin hiển thị trên bảng điều khiển phụ thuộc rất nhiều vào bảng điều khiển; nó chắc chắn phụ thuộc vào hệ điều hành.

Trên Windows, bạn có thể sử dụng chức năng SetConsoleMode để bật/tắt tiếng vọng cho bất kỳ thao tác xử lý tệp nào, bao gồm cả xử lý nhập chuẩn.

Something như

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); 
} 

có thể có thể được sử dụng để chuyển đổi tiếng vang trên stdin.

+0

Trên hệ thống cửa sổ, nó hoạt động như sự quyến rũ! Bây giờ thử dùng getpass với gcc-linux. – ZoomIn

+1

void enableStdinEcho (bool b) { \t int ttyDevice = STDOUT_FILENO; struct termios termAttributes; /* Đảm bảo bộ mô tả tập tin dành cho thiết bị TTY. */ nếu (! Isatty (ttyDevice)) { thoát (1); \t} else { \t if (tcgetattr (ttyDevice, & termAttributes) = 0!) { \t \t \t \t exit (1); \t \t \t} else { \t \t \t \t if (b == false) \t \t \t \t \t termAttributes.c_lflag & = ~ ECHO; \t \t \t \t khác \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} } tương đương với unix/linux based.Got làm việc này. – ZoomIn

3

Tiêu chuẩn C++ không xác định cơ chế để thực hiện việc này. Bạn phải dựa vào một thư viện nền tảng cụ thể. Ví dụ với việc sử dụng gcc/glibc getpass

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

Có thể có các thư viện khác mà trừu tượng các chức năng và cung cấp một nền tảng wrapper độc lập.

+0

Không cần thư viện chính thức, 'tcsetattr' thường đủ các thông báo. Các manpage cho glibc 'getpass' thậm chí còn nói:" Chức năng này đã lỗi thời. Không sử dụng nó. " – PlasmaHH

+0

Có tcsetattr sẽ làm đủ cho gcc. – ZoomIn

2

Đây không phải là câu hỏi C++, iostream.v.v .. - tất cả đều cụ thể cho thiết bị đầu cuối bạn đang sử dụng.

Xem this question để biết các ý tưởng và sau đó đặt câu hỏi cụ thể cho thiết bị đầu cuối của bạn nếu thiết bị không được bao phủ ở đó và bạn không thể sử dụng ncurses.

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