2016-12-23 16 views
-2

正しく動作していない(つまり、適切なユーザーIDとパスワードを入力していても間違ったユーザーIDとパスワードが表示される)C++ログインシステムをデバッグしようとしています。
登録すると、ログイン情報がバイナリファイルに保存され、ログイン時にそのファイル(ID.dat)が読み込まれ、一致するものがあるかどうかが確認されます。
これは私の高校のプロジェクトであり、私は本当にこれを修正しなければなりません。私は本当に、本当に長い時間のためにそれをしようとしてきました。考えられるエラーを指摘してください。ご協力ありがとうございました。C++でのログインシステムが動作しない

編集:私は、新しい機能を追加しましたが、

//Class for storing IDs 
char Level; 
class ID 
{ 
    public: 
    char username[20],pass1[20],pass2[20],IDtype,systemID[5]; 
    int checkuser(char u[20]) 
    { 
     return(strncmp(u,username,strlen(u))); 
    } 
    int checkpass(char p[20]) 
    { 
     return(strncmp(p,pass1,strlen(p))); 
    } 
}; 

//Registration function 
void IDregister() 
{ 
    clrscr(); 
    ID i; 
    ofstream fout; 
    fout.open("ID.dat",ios::app); 
    gotoxy(30,6); 
    cout<<"*--- Register ---*"; 
    gotoxy(25,9); 
    cout<<" Enter User ID - "; 
    fgets(i.username,21,stdin); 
    gotoxy(25,11); 
    cout<<" Enter Password - "; 
    fgets(i.pass1,21,stdin); 
    do 
    { 
     cout<<"\n   Re-enter Password - "; 
     fgets(i.pass2,21,stdin); 
    }while(strncmp(i.pass1,i.pass2,strlen(i.pass1))!=0); 
    cout<<"\n  To register as Admin, type system ID below.\n   Else press Enter "; 
    fgets(i.systemID,6,stdin); 
    if(strncmp(i.systemID,"#123#",5)==0) 
     i.IDtype='A'; 
    else 
     i.IDtype='U'; 
    fout.write((char*)&i,sizeof(i)); 
    cout<<i.IDtype; 
    getch(); 
    fout.close(); 
    IDlogin(); 
} 

//Log-in Function 
void IDlogin() 
{ 
    clrscr(); 
    int flag=1; 
    ID acc; 
    char usercheck[20],passcheck[20]; 
    ifstream fin; 
    fin.open("ID.dat",ios::in); 
    gotoxy(30,7); 
    cout<<"*--- Log-in ---*"; 
    gotoxy(25,10); 
    cout<<"Enter User ID - "; 
    fgets(usercheck,21,stdin); 
    gotoxy(25,12); 
    cout<<"Enter Password - "; 
    fgets(passcheck,21,stdin); 
    gotoxy(25,14); 
    while(!fin.eof()) 
    { 
     fin.read((char*)&acc,sizeof(acc)); 
     if(acc.checkuser(usercheck)==0&&acc.checkpass(passcheck)==0) 
      flag=0; 
    } 
    if(flag==0) 
    { 
     cout<<"Logged in successfully!"; 
     Level=acc.IDtype; 
     getch(); 
     mainscreen(); 
    } 
    else 
    { 
     cout<<"Wrong User ID or Password"; 
     getch(); 
     initscreen(); 
    } 
} 
+5

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。詳しい読書:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

1.プロジェクトをC++で起動すると、 C++の文字列などを使用します。多くの初期化されていないデータがここにあります。 2.混合非標準ビジュアルライブラリ(clrscr、getchなど)と標準ストリームをデバッグするのは難しい。 –

+0

なぜ 'C'関数を使用していて、客観的に優れた' C++ '関数を使用していませんか? –

答えて

0

の代わりにstrcmp、機能strncmpを使用してみてください動作するようには思えません。これにより、最大n文字で比較され、文字配列に先行するジャンクがある場合は比較されません。 Documentation of strncmp

さらに、getsを使用すると、安全でないため、代わりにfgetsを使用することを検討してください。

int checkuser(char u[20]) 
    { 
     return(strncmp(u,username, strlen(username))); 
    } 
    int checkpass(char p[20]) 
    { 
     return(strncmp(p,pass1, strlen(pass)); 
    } 
+0

このように 'strncmp'を使うと、文字列の部分集合 –

+5

と首尾良く一致します。あるいは、C++を書いているので、暗黒時代の中世の魔法ではなく適切な機能を使用します。 –

+0

ええ、OPは彼のコードをかなり混ぜています..なぜ彼はcin.get()や何かの代わりにgets()を使用していたのだろうか。 – Hawk

関連する問題