2012-02-15 10 views
9

私はC++のプログラムを書いています。ここでは、ユーザーが画面に表示しないで文字列を受け取ることになっています(例:apassword)。私はcingetsを使用して文字列を受け入れようとしました。しかし、どちらもコンソールでユーザーが入力した文字をエコーし​​ます。C++で文字通りの文字列が入力されない

C++で関数やその他の方法がありますか?

+0

投稿開始時のHiは自動的に削除されます! – ZoomIn

+0

はい、それは良いことです:私たちは、ここでの質問(および回答)を維持しようとします。 "Hi"と "thanks"を使用していない*スタックオーバーフローで無益だとみなされていません。とにかく、upvote、良い質問があります。 –

+1

* NCurses *(unix)と* PDCurses *(ウィンドウ)をチェックしてください。 –

答えて

3

cinで読み取ったデータがコンソールに表示されないようにする方法は、コンソールによって大きく異なります。それは確かにオペレーティングシステムに依存しています。

Windowsでは、SetConsoleMode機能を使用して、標準の入力ハンドルを含むファイルハンドルのエコーを有効/無効にすることができます。

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

よう

何かがおそらく標準入力のエコーを切り替えるために使用することができます。

+0

Windowsシステムでは、gcc-linuxでgetpassを試してみました。 – ZoomIn

+1

void enableStdinEcho(bool b){ \t int ttyDevice = STDOUT_FILENO; struct termios termAttributes; ; /*ファイル記述子がTTYデバイス用であることを確認してください。 */ if(!isatty(ttyDevice)){ exit(1); \t}他{ \t(のtcgetattr(ttyDevice、&termAttributes)!= 0){ \t \t \t \t終了すると(1)。他 \t \t \t} { \t \t \t \t IF(B == false)を \t \t \t \t \t termAttributes。c_lflag&=〜ECHO;他 \t \t \t \t \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} } UNIX/Linuxベースで同等です。このようなことは機能しています。 – ZoomIn

3

C++標準ではこれを行うための仕組みが定義されていません。プラットフォーム固有のライブラリに依存する必要があります。 GCC/glibcの使用と例えば

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

getpass

は、抽象的な、これらの機能とは、プラットフォームに依存しないラッパーを提供する他のライブラリがあるかもしれません。

+0

本格的なライブラリを必要とせず、通常はtcsetattrで十分です。 glibc 'getpass'のマンページでは、「この関数は廃止されています。使用しないでください。 – PlasmaHH

+0

はいtcsetattrはgccで十分です。 – ZoomIn

2

これはC++、iostreamなどの質問ではありません。使用している端末固有の質問です。

アイディアについてはthis questionを参照してください。そこにはカバーされておらず、ncursesを使用できない場合は、端末固有の質問をしてください。

関連する問題