2010-12-21 9 views
2

パスワードを隠したままでユーザーが入力したパスワードを簡単に保存できますか?getch()の完全性を維持しながらパスワードを保存する

char password[9]; 
    int i; 
    printf("Enter your password: "); 
    for (i=0;i<9;i++) 
    { 
    password[i] = getch(); 
    printf("*"); 
    } 
    for (i=0;i<9;i++) 
    printf("%c",password[i]); 
    getch(); 
    } 

私は正しいパスワードがオンに引き続きとても簡単if (password[i] == root_password)を行うことができますので、パスワードを保存したいです。

+0

あなたは 'Cでgetch'を使用している++ではなく' cin.get'の任意の特定の理由をテストしましたか? –

+0

理由はありません他の適切な方法を見つけることができませんでした。 –

+2

@Cody:典型的なcin.get()とは異なり、getchは入力をエコーし​​ません – ybungalobill

答えて

0

あなたの問題は、改行 '\ n'やファイルの終わりをチェックしていないことが原因です。

printf("Enter your password: "); 
char password[9]; 
int i; 
for (i = 0; i < sizeof password - 1; i++) 
{ 
    int c = getch(); 
    if (c == '\n' || c == EOF) 
     break; 
    } 
    password[i] = c; 
    printf("*"); 
} 
password[i] = '\0'; 

この方法では、パスワードはprintf("%s", password)putsでの印刷に適したASCIIZ文字列、になってしまう、もしくはます - 私たちはに最大8つの文字を読んで決定的に...

if (strcmp(password, root_password)) == 0) 
    your_wish_is_my_command(); 

注意パスワードはNULターミネータのために1文字余分に必要です。あなたが望むならそれを増やすことができます。

+0

なぜこのセクションのすべての変数は宣言されていないのですか? –

+0

Josh:printf()とgetch()、strcmp()のために必要なヘッダーも含めていますか?さもなければ、私はあなたの正確なコードを見ることなく言うことができません - なぜあなたは上記の質問に貼り付けて、正確なコンパイラのエラーと行番号を列挙しないでください...? –

+0

あなたはsizeofを正しく使用していません。まず、missing()があり、バイト単位のサイズが返されます。 sizeofのホッププラの代わりに、10を置くことができます。-1は、<がより小さい、演算子以下であることを妨げます。 –

0

WindowsではコンソールAPIを使用する必要があります。以下は、コンソールウィンドウでエコーを無効にするスニペットです。関数SetConsoleMode()は、(他のものの中でも)エコーを制御するために使用されます。古いモードを保存するので、パスワードが取得されたらコンソールを復元できます。

また、*ConsoleMode()関数には、コンソール入力バッファのハンドルが必要です。これらのバッファの処理方法については、CreateFile()のMSDNドキュメントを参照してください。

int main(int argc, char* argv[]) 
{ 
    char password[100] = { 0 }; 
    printf("Enter your password: "); 

    HANDLE hConsole = ::CreateFile("CONIN$", GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0); 

    DWORD dwOldMode; 
    ::GetConsoleMode(hConsole, &dwOldMode); 
    ::SetConsoleMode(hConsole, dwOldMode & ~ENABLE_ECHO_INPUT); 

    bool bFinished = false; 
    while(!bFinished) { 
     if(!fgets(password, sizeof(password)/sizeof(password[0]) - 1, stdin)) { 
      printf("\nEOF - exiting\n"); 
     } else 
      bFinished = true; 
    } 

    ::SetConsoleMode(hConsole, dwOldMode | ENABLE_ECHO_INPUT); 
    printf("\nPassword is: %s\n", password); 

    return 0; 
} 
0

我々はC++とWindowsであるので、このです:

#include <iostream> 
#include <string> 
#include <conio.h> //_getch 
#include <Windows.h> //VK_RETURN = 0x0D 

using namespace std; 

string read_password() 
{ 
    string pass; 
    cout << "Enter your password: "; 

    int character = 0; 
    while(VK_RETURN != (character = _getch())) 
    { 
     cout << '*'; 
     pass += static_cast<char>(character); 
    } 

    cout << std::endl; 
    return pass; 
} 

int main() 
{ 
    string root_password = "anypass123"; 
    string pass = read_password(); 

    if (pass == root_password) 
    { 
     cout << "password accepted" << endl; 
    } 

    return 0; 
} 

&をコンパイルは

関連する問題