c - 使用二叉搜索树 C 编程进行登录验证

标签 c authentication 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);
    }
}

用户.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

最佳答案

我不知道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

关于c - 使用二叉搜索树 C 编程进行登录验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33436925/

相关文章:

c++ - 二叉树插入算法

c - 来自父级的 SIGTERM 信号不会调用子级中的信号处理程序?

c - 如何在 C 中将 fprintf 与动态分配的 unsigned char* 数组一起使用

c++ - posix 线程同步停止在同一代码

cocoa - 是否可以更换 Mac 登录屏幕?

sql - 28P01--DataGrip 中用户的密码验证失败

c++ - 我的哈希表比二进制搜索慢

c++ - 统计函数 : no such file or directory error

php - API 的可信应用程序

java - 如何遍历所有可能的解决方案路径并选择最佳路径