题解:这段代码的要求如下,输入一段字符密码(长度<=8)以二进制的形式存放在磁盘中,在输入时需要验证两次输入是否正确。
第二个,登录。从磁盘中读取这个文件,然后再输入密码,看两者是否相同。
登录密码需要用到的知识
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())!='\r');i++) putchar('*'); printf("\n再次输入密码\n"); for(j=0;j<8 && ((b[j]=getch())!='\r');j++) putchar('*'); a[i]='\0'; b[j]='\0'; if(strcmp(a,b)!=0) printf("\n输入错误,请重新输入!\n"); else break; }while(1); fp=fopen("password.dat","wb"); i=0; while(a[i]) { putc(a[i],fp); i++; }; } int main() { logon(); return 0; }
读取密码的注意点
假如二进制文件中存放一个密码,已知密码长度<=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]='\0'; else pwd[i-1]='\0';
登录密码检测
有一个特别的地方是如果输入3次错误则返回,模型如下:
void logon() { int n=3; do { .. if(密码不同) { ..; n--; } }while(n>0); .. }