1

私は久しぶりにCに飛び込み、構造体を単純なテキストファイルに読み書きするのに苦労しています。このプログラムをデバッグしたところ、ファイルのガベージ値を読み書きしていることがわかりました。誰かが私を助けることができますか?これが私のコードです

#define MAX_UserName_LEN 16
#define MAX_Password_LEN 8
#define MAX_FileName_LEN 32

struct userDetails
{
char userName[MAX_UserName_LEN];
char password[MAX_Password_LEN];
};

int registration(struct userDetails userInfo)
{
FILE *userDb;
userDb= fopen("UserDataBase.txt","a");
if(fwrite(&userInfo,sizeof(userInfo),1,userDb))
{
    fclose(userDb);
    return 1;
}
else
{
    return 0;
}

}

int authenicate(struct userDetails userInfo)
{
FILE *userDb;
struct userDetails temp;
userDb = fopen("UserDataBase.txt","r");
while(!feof(userDb))
{
  fread(&temp,sizeof(temp),1,userDb);
  if (temp.userName==userInfo.userName && temp.password==userInfo.password)
  {
    printf("Logged In Sucessfully");
    return 1;
  }
 }
 return 0;

}

メイン関数では、1 つの構造体変数を宣言し、その構造体へのユーザー入力を受け入れ、それを上記の両方の関数に渡します。

4

2 に答える 2

3

私が目にする最初の大きな問題はここにあります:

if (temp.userName==userInfo.userName && temp.password==userInfo.password)

文字列を と比較しようとしています==strcmp()代わりに使用する必要があります:

if (strcmp(temp.userName, userInfo.userName) == 0 && 
    strcmp(temp.password, userInfo.password) == 0)

これがあなたが得ている「ゴミ」と関係があるかどうかはわかりませんが、間違いなくエラーです。

あなたのコードは現在立っているので、if ステートメントに入ることはありません。

于 2011-11-16T07:58:31.313 に答える
0

ユーザーリストを出力する短いコードを書いて、ファイルにゴミが含まれているかどうかを確認します。

とにかく、パスワードは何らかの方法でスクランブルする必要があります。人間の目には判読できないようにするためだけに、ばかげた解決策でさえ、何もないよりはましです。たとえば、for (n = 0; n < strlen(pwd); n++) pwd[n] ^= 0x55; とします。.

于 2011-11-16T08:09:46.593 に答える