使用二进制搜索树C编程进行登录验证

时间:2015-10-30 13:16:17

标签: c login binary-search-tree

我尝试使用二叉搜索树方法创建登录页面。 用户ID存储在记事本中,因此我首先将其传输到程序内的结构中。它已经工作,每次我使用写在记事本上的用户名和密码登录。但是有一些错误,每当我写下不在记事本中的用户名时,程序就会崩溃。

do{
    char user[100];
    char pass[100];
    printf("Input your username : ");
    scanf("%[^\n]",&user);fflush(stdin);
    printf("Input your password : ");
    scanf("%[^\n]",&pass);fflush(stdin);
    printf("\n\n");
    searchID(root,user,pass);
    if(flagID==0 || flagPass==0)
    {
        printf("Invalid Username/Password\n");
    }
    else if(flagID==1 && flagPass==1)
    {
        printf("Login Successful\n");
    }

}while(flagID==0 || flagPass==0);

这是登录页面的代码

这是searchID函数

if(temp->left== NULL && temp-> right == NULL && strcmp(temp->pass,pass)!=0)
{
    printf("Username Not Found\n");
    flagID=0;
}
else if(strcmp(temp->user,user)==0)
{
    if(strcmp(temp->pass,pass)==0)
    {
        flagPass=1;
    }
    else
    {
        flagPass=0;
    }
    flagID=1;
}
else if(strcmp(temp->user,user)<0)
{
    searchID(temp->left,user,pass);
}
else if(strcmp(temp->user,user)>0)
{
    searchID(temp->right,user,pass);
}
if(temp->left== NULL && temp-> right == NULL && strcmp(temp->pass,pass)!=0)
{
    printf("Username Not Found\n");
    flagID=0;
}

我不明白为什么这部分似乎不起作用。 据我所知,逻辑已经是正确的

有什么想法吗?

整个代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

void clrscr();
void readFile();
void insertID(struct login **temp,char* user,char* pass, int score,char* jabatan);
void inOrder(struct login *root);
void searchID(struct login *temp,char* user,char* pass);

void menu();


int count =0;
int flagID=0;
int flagPass=0;

struct login{
char user[100];
char pass[100];
int score;
char jabatan[10];
struct login *left,*right;
}*root,*curr;



int main()
{
    readFile();
    menu();
    getchar();
    clrscr();

    getchar();

    return 0;   
}

void menu()
{

    clrscr();
    do{
        char user[100];
        char pass[100];
        printf("Input your username : ");
        scanf("%[^\n]",&user);fflush(stdin);
        printf("Input your password : ");
        scanf("%[^\n]",&pass);fflush(stdin);
        printf("\n\n");
        searchID(root,user,pass);
        if(flagID==0 || flagPass==0)
        {
            printf("Invalid Username/Password\n");
        }
        else if(flagID==1 && flagPass==1)
        {
            printf("Login Successful\n");
        }

    }while(flagID==0 || flagPass==0);
}

void clrscr()
{
    for(int i=0;i<25;i++)
    {
        printf("\n");
    }
}

void readFile()
{
    char temp_user[100];
    char temp_pass[100];
    int temp_score;
    char temp_jabatan[20];

    FILE *f ;
    f=fopen("user.txt","r");
    while(!feof(f))
    {
        fscanf(f,"%[^|]|%[^|]|%d|%[^\n]\n",&temp_user,&temp_pass,&temp_score,&temp_jabatan);
        insertID(&root,temp_user,temp_pass,temp_score,temp_jabatan);
        count++;
    }
    fclose(f);

}

void insertID(struct login **temp,char* user,char* pass, int score,char* jabatan)
{

    if(*temp==NULL)
    {
        curr=(struct login*)malloc(sizeof(struct login));
        strcpy(curr->user,user);
        strcpy(curr->pass,pass);
        curr->score=score;
        strcpy(curr->jabatan,jabatan);
        *temp=curr;
        curr->left=curr->right=NULL;
    }
    else
    {
        if(curr->score<score)
        {
            insertID(&(*temp)->right,user,pass,score,jabatan);
        }
        else if(curr->score>score)
        {
            insertID(&(*temp)->left,user,pass,score,jabatan);
        }
    }

}

void searchID(struct login *temp,char* user,char* pass)
{
    if(temp->left== NULL && temp-> right == NULL && strcmp(temp->pass,pass)!=0)
    {
        printf("Username Not Found\n");
        flagID=0;
    }
    else if(strcmp(temp->user,user)==0)
    {
        if(strcmp(temp->pass,pass)==0)
        {
            flagPass=1;
        }
        else
        {
            flagPass=0;
        }
        flagID=1;
    }
    else if(strcmp(temp->user,user)<0)
    {
        searchID(temp->left,user,pass);
    }
    else if(strcmp(temp->user,user)>0)
    {
        searchID(temp->right,user,pass);
    }
}


void inOrder(struct login *root)
{
    if(root)
    {
        inOrder(root->left);
        printf("%s - %d\n",root->user,root->score);
        inOrder(root->right);
    }
}

user.txt

rio|io|14|admin
hermanto|manto|50|member
andry kurniawan|awan|56|member
charles sutanto|char|25|member
dianto erwin|erwin|28|admin
kuki karuna|kuki|125|admin
izra|iz|9|member
timothy agustian|tim|15|admin
susi|sus|4|member
ryan purnama|pur|2|member
stephanus sujatmoko|moko|19|member

1 个答案:

答案 0 :(得分:0)

我不知道 users.txt 的样子,我的看起来像这样:

  

michi passwd 25 LoL

代码如下所示:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

int count =0;
int flagID=0;
int flagPass=0;

struct login{
    char user[100];
    char pass[100];
    int score;
    char jabatan[10];
    struct login *left,*right;
}*root,*curr;


void clrscr(void){
    int i=0;
    for(i=0;i<25;i++){
        printf("\n");
    }
}

void searchID(struct login *temp,char* user,char* pass){
    if(temp->left == NULL && temp->right == NULL && strcmp(temp->pass,pass)!=0){
        printf("Username Not Found\n");
        flagID=0;
    }else if(strcmp(temp->user,user)==0){
        if(strcmp(temp->pass,pass)==0){
            flagPass=1;
        }else{
            flagPass=0;
        }

        flagID=1;
    }else if(strcmp(temp->user,user)<0){
        searchID(temp->left,user,pass);
    }else if(strcmp(temp->user,user)>0){
        searchID(temp->right,user,pass);
    }
}

void menu(void){
    do{
        char user[100];
        char pass[100];

        printf("Input your username : ");
        if((scanf("%99s",user)) != 1){
            printf("Error 1, Fix it!");
        }

        printf("Input your password : ");
        if((scanf("%99s",pass)) != 1){
            printf("Error 2, Fix it!");
        }

        printf("\n\n");

        searchID(root,user,pass);

        if(flagID==0 || flagPass==0){
            printf("Invalid Username/Password\n");
        }else if(flagID==1 && flagPass==1){
            printf("Login Successful\n");
            break;
        }

    }while(flagID==0 || flagPass==0);
}

void insertID(struct login **temp,char* user,char* pass, int score,char* jabatan){

    if(*temp==NULL){
        curr=malloc(sizeof(struct login));
        strcpy(curr->user,user);
        strcpy(curr->pass,pass);
        curr->score=score;
        strcpy(curr->jabatan,jabatan);
        *temp=curr;
        curr->left = curr->right=NULL;
    }else{
        if(curr->score<score){
            insertID(&(*temp)->right,user,pass,score,jabatan);
        }else if(curr->score>score){
            insertID(&(*temp)->left,user,pass,score,jabatan);
        }
    }
}

void readFile(void){
    char temp_user[100];
    char temp_pass[100];
    int temp_score;
    char temp_jabatan[20];

    FILE *f;
    f = fopen ("user.txt" , "r" );
    if (f==NULL){
        printf("\n");
        printf("\tThe file %s does not Exists\n", "user.txt");
        exit(1);
    }

    while((fscanf(f,"%99s%99s%d%19s",temp_user,temp_pass,&temp_score,temp_jabatan)) == 4) {
            insertID(&root,temp_user,temp_pass,temp_score,temp_jabatan);
            count++;
    }
    fclose(f);
}

void ok(struct login *root){
    if(root){
        ok(root->left);
        printf("%s - %d\n",root->user,root->score);
        ok(root->right);
    }
}

int main(void){
    readFile();
    menu();
    free(curr);
    return 0;
}

输出:

Input your username : michi
Input your password : lol
Username Not Found
Invalid Username/Password
Input your username : michi
Input your password : passwd


Login Successful