2011-08-01 30 views
12

संभव डुप्लिकेट:
Read a password from std::cinछिपाएं पासवर्ड पर उपयोगकर्ता इनपुट संकेत

मैं कंसोल के साथ सामान्य रूप से काम नहीं करते हैं, तो मेरे सवाल का जवाब देने शायद बहुत आसान या ऐसा करने के लिए असंभव है ।

क्या cin और cout "decouple" करना संभव है, तो जो मैं कंसोल में टाइप करता हूं वह सीधे इसमें दिखाई नहीं देता है?

मुझे उपयोगकर्ता को पासवर्ड टाइप करने और न तो मुझे और न ही उपयोगकर्ता सामान्य रूप से स्क्रीन पर plaintext में अपना पासवर्ड दिखाना चाहता है।

मैंने std::cin.tie का उपयोग stringstream पर करने का प्रयास किया, लेकिन जो कुछ भी मैं टाइप करता हूं वह अभी भी कंसोल में प्रतिबिंबित है।

+0

यह भी देखें: https://github.com/Seldaek/hidden-input – mauris

उत्तर

29
How to Hide Text से

:

विंडोज

#include <iostream> 
#include <string> 
#include <windows.h> 

using namespace std; 

int main() 
{ 
    HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); 
    DWORD mode = 0; 
    GetConsoleMode(hStdin, &mode); 
    SetConsoleMode(hStdin, mode & (~ENABLE_ECHO_INPUT)); 

    string s; 
    getline(cin, s); 

    cout << s << endl; 
    return 0; 
}//main 

सफाई:

SetConsoleMode(hStdin, mode); 

tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 

लिनक्स

#include <iostream> 
#include <string> 
#include <termios.h> 
#include <unistd.h> 

using namespace std; 

int main() 
{ 
    termios oldt; 
    tcgetattr(STDIN_FILENO, &oldt); 
    termios newt = oldt; 
    newt.c_lflag &= ~ECHO; 
    tcsetattr(STDIN_FILENO, TCSANOW, &newt); 

    string s; 
    getline(cin, s); 

    cout << s << endl; 
    return 0; 
}//main 
+2

'tcsetattr (STDIN_FILENO, TCSANOW, &oldt); 'लिनज़ में क्लीनअप के लिए भी आवश्यक है। –

2

उपयोग getch() बजाय cin का उपयोग कर के इनपुट प्राप्त करने के लिए है, तो इनपुट नहीं दिखाया जाएगा (के हवाले से विकि):

पूर्णांक getch (शून्य) बफर के बिना कंसोल से सीधे एक चरित्र पढ़ता है, और गूंज के बिना।

यह वास्तव में सी है, सी ++ नहीं, लेकिन यह आपके अनुरूप हो सकता है।

इसके अलावा, यहां another link है।

5

आप वास्तव में दो असंबंधित मुद्दों के बारे में पूछ रहे हैं।
cin.tie(NULL) कॉलिंग std::cin और std::cout कॉलिंग पूरी तरह से। लेकिन यह निचले स्तर पर कुछ भी प्रभावित नहीं करता है। और निम्नतम स्तर पर, कम से कम विंडोज और यूनिक्स के तहत, std::cin और std::cout दोनों सिस्टम स्तर पर एक ही डिवाइस से जुड़े हुए हैं, और यह डिवाइस (/dev/tty यूनिक्स के तहत) है जो गूंजता है; आप एक फ़ाइल में मानक को रीडायरेक्ट भी कर सकते हैं, और कंसोल अभी भी इनपुट गूंज देगा।

आप इस गूंज को कैसे बंद करते हैं सिस्टम पर निर्भर करता है; सबसे आसान समाधान शायद किसी प्रकार की तीसरी पार्टी लाइब्रेरी का उपयोग करना है, जैसे कि शाप या ncurses, जो एक उच्च स्तरीय इंटरफ़ेस प्रदान करता है, और सभी सिस्टम निर्भरताओं को छुपाता है।