题目答案
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <bios.h>
typedef struct{
char name[7];
char secret[11];
}User_t;
void getname(char *str)
{
char name[32];
char c;
int k;
do{
printf("\nEnter name and press ENTER: ");
scanf("%s", name);
if(strlen(name) > 6){
printf("Name is too long!\nPress Y to enter it again or N to exit! ");
c = bioskey(0);
putchar(c);
}
else{
k = strlen(name);
memcpy(str, name, k);
str[k] = '\0';
break;
}
}while(c == 'Y' || c == 'y');
if(c == 'N' || c == 'n')
exit(1);
}
void getsecret(char *str, int sgin)
{
char secret[2][16];
char c;
int k, s, i = 0;
int N;
if(sgin) N = 2;
else N = 1;
do{
for(k = 0; k < N; k++){
printf("\nEnter secret end with ENTER: ");
i = 0;
while((c = bioskey(0)) != 13 /*CR*/ ){
putchar('*');
secret[k] = c;
i++;
}
secret[k] = '\0';
if(i < 6 || i > 10){
printf("\n Not good secret!\nPress Y to input again or N to exit! ");
c = bioskey(0);
putchar(c);
}
else{
s = strlen(secret[k]);
memcpy(str, secret, s);
str[s] = '\0';
}
}
if(N == 2 && (strcmp(secret[0], secret[1]) != 0)){
printf("\nThe second input does not same with rhe first.\nPress Y to input again or N to exit! ");
c = bioskey(0);
putchar(c);
}
}while(c == 'Y' || c == 'y');
}
char *filename(char *name)
{
char fname[16];
char *file = "data\\";
char sname[11];
char *s = ".txt";
strcpy(sname, name);
strcat(sname, s);
strcpy(fname, file);
strcpy(fname, strcat(fname, sname));
return fname;
}
void adduser(void)
{
FILE *fp, *fl;
User_t user1, user2;
int i;
char Fname[16];
char c;
if((fl = fopen("data\\name.txt", "ab")) == NULL)
fl = fopen("data\\name.txt", "wb");
do{
getname(user1.name);
getsecret(user1.secret, 1);
fprintf(fl, "%7s", user1.name);
strcpy(Fname, filename(user1.name));
if((fp = fopen(Fname, "rb+")) == NULL)
fp = fopen(Fname, "wb+");
while(!feof(fp)){
fread(&user2, sizeof(User_t), 1, fp);
for(i = 0; i < strlen(user1.name); i++){
user1.name = tolower(user1.name);
user2.name = tolower(user2.name);
}
if(strcmp(user1.name, user2.name) == 0){
printf("\nname has be used!\nPress C to Enter it again or E to exit! ");
fclose(fp);
c = bioskey(0);
putchar(c);
break;
}
}
if(feof(fp)){
fclose(fp);
fp = fopen(Fname, "ab+");
fwrite(&user1, sizeof(User_t), 1, fp);
fclose(fp);
printf("\nAdd user sccessful!\nPress C to add continue or E to exit! ");
c = bioskey(0);
putchar(c);
}
}while(c == 'C' || c == 'c');
fclose(fl);
}
void login(void)
{
FILE *fp;
User_t user1, user2;
char Fname[16];
int i;
int k = 0;
do{
getname(user1.name);
getsecret(user1.secret, 0);
strcpy(Fname, filename(user1.name));
fp = fopen(Fname, "rb");
while(!feof(fp)){
fread(&user2, sizeof(User_t), 1, fp);
for(i = 0; i < strlen(user1.name); i++){
user1.name = tolower(user1.name);
user2.name = tolower(user2.name);
}
if((strcmp(user1.name, user2.name) == 0) && (strcmp(user1.secret, user2.secret) == 0) ){
printf("\nLogin sccessful!");
return ;
}
}
if(feof(fp)){
printf("\nname or secret ERROR! ");
}
k++;
}while(k < 3);
if(k >= 3)
printf("\nBad user!\n");
}
void check_secret(void)
{
FILE *fp;
User_t user1, user2;
char Fname[16];
int i;
getname(user1.name);
getsecret(user1.secret, 0);
strcpy(Fname, filename(user1.name));
fp = fopen(Fname, "rb");
while(!feof(fp)){
fread(&user2, sizeof(User_t), 1, fp);
fclose(fp);
for(i = 0; i < strlen(user1.name); i++){
user1.name = tolower(user1.name);
user2.name = tolower(user2.name);
}
if(strcmp(user1.name, user2.name) == 0){
if( strcmp(user1.secret, user2.secret) == 0 ){
getsecret(user1.secret, 1);
strcpy(user2.secret, user1.secret);
fp = fopen(Fname, "wb");
fwrite(&user1, sizeof(User_t), 1, fp);
fclose(fp);
printf("\nchange secret sccessful!\n");
}
else{
printf("\nsecret ERROR!\n");
}
break;
}
}
if(feof(fp)){
printf("\nname or secret ERROR! ");
}
}
int substring(char *
s1, char *s2)
{
int i = 0, j = 0;
while(i < strlen(s1) && j < strlen(s2)){
if(s1 == s2[j]){
i++;
j++;
}
else{
i = i-j+1;
j = 0;
}
}
if(j >= strlen(s2))
return 1;
return 0;
}
void search_user(void)
{
FILE *fl;
char name1[7], name2[7];
printf("\nInput name: ");
scanf("%s", name1);
fl = fopen("data\\name.txt", "rb");
printf("\nThe output:\n\t");
while(!feof(fl)){
fscanf(fl, "%7s", name2);
if(substring(name2, name1)){
printf("\n\t%s\n\t", name2);
}
}
}
int main(void)
{
int c;
clrscr();
while(1){
printf("\n\t0 to exit.");
printf("\n\t1 add user.");
printf("\n\t2 login.");
printf("\n\t3 change secret.");
printf("\n\t4 seach user.\n\n\t");
scanf("%d", &c);
switch(c){
case 0: break;
case 1: adduser(); break;
case 2: login(); break;
case 3: check_secret(); break;
case 4: search_user(); break;
default: break;
}
if(c < 1 || c > 4)
break;
}
return 0;
}