信息管理代码分析<一>登录密码

题解:这段代码的要求如下,输入一段字符密码(长度<=8)以二进制的形式存放在磁盘中,在输入时需要验证两次输入是否正确。
第二个,登录。从磁盘中读取这个文件,然后再输入密码,看两者是否相同。

  1. 登录密码需要用到的知识
  2. 读取密码的注意点
  3. 登录密码检测

登录密码需要用到的知识
1.getch()取字符无回显。
2.strcmp()比较两个字符串是否相等(相等返回0)
3.对输入字符的检测(包括对回车符的判定)
代码如下:

#include "stdio.h"
#include "conio.h"
#include "string.h"
char a[9],b[9];
void logon()
{
    FILE *fp;
    int i,j;
    do{
    for(i=0;i<8 && ((a[i]=getch())!='
');i++)
    putchar('*');
    printf("
再次输入密码
");
    for(j=0;j<8 && ((b[j]=getch())!='
');j++)
    putchar('*');
    a[i]='';
    b[j]='';
    if(strcmp(a,b)!=0)
        printf("
输入错误,请重新输入!
");
    else
        break;
    }while(1);
    fp=fopen("password.dat","wb");
    i=0;
    while(a[i])
    {
        putc(a[i],fp);
        i++;
    };
}
int main()
{
    logon();
    return 0;
}
        
View Code

读取密码的注意点
假如二进制文件中存放一个密码,已知密码长度<=8,如何读取密码?
由于在后面需要比较,所以使用字符串来存储,但是字符串又需要一个结束符,所以字符串的最大长度为9,得到:char pwd[9];
而密码的长度分为两种情况:
第一种,密码长度<8
第二种:密码长度最大=8
而在外存中的密码存储形式为:***** -1 ^(共中-1为eof),现在根据while(!feof(fp))来判定,会多读取一个字符。

while(!feof(fp) && i<8)
pwd[i++]=fgetc(fp);

如果密码长度正好等于8,则循环结束后,i=8;如果密码长度小于8,比如=3,则循环结束后,i=4,数组pwd获得的数据为:
* * * -1,而i当前又等于4,所以要把这个-1置为字符串结束符,得到:pwd[i-1]=0。
最终,在判定上分为两种可能

while(!feof(fp) && i<8)
{
    pwd[i++]=fgetc(fp);
}
if(i==8)pwd[i]='';
else pwd[i-1]='';

登录密码检测
有一个特别的地方是如果输入3次错误则返回,模型如下:

void logon()
{
    int n=3;
    do
    {
        ..
        if(密码不同)
        {
            ..;
            n--;
        }
    }while(n>0);
    ..
}
原文地址:https://www.cnblogs.com/tinaluo/p/5343565.html