我尝试使用二叉搜索树方法创建登录页面。 用户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
答案 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