2015-10-30 37 views
0

我想通過使用二進制搜索樹方法使登錄頁面。 用戶ID存儲在記事本中,所以我必須先將它傳輸到我的程序中的結構中。它已經工作,每次我登錄使用用戶名和密碼寫在記事本上。但是有一些錯誤,每次我寫入不在記事本中的用戶名時,程序就會崩潰。登錄驗證使用二進制搜索樹C編程

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 
+0

您不能刷新標準輸入。見http://stackoverflow.com/questions/2187474/i-am-not-able-to-flush-stdin –

+0

如果我不給任何fflush(標準輸入)它將是一個無限循環 –

+0

爲什麼不檢查從'scanf'返回值,並且還要閱讀新的行字符 –

回答

0

我不知道users.txt的樣子,我的是這樣的:

之道的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