C語(yǔ)言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能
C語(yǔ)言利用文件系統(tǒng)實(shí)現(xiàn)簡(jiǎn)單的用戶(hù)登錄和注冊(cè)功能
版本一:利用數(shù)組
最近有個(gè)朋友讓我?guī)退鲆粋€(gè)C語(yǔ)言的登錄注冊(cè)功能,考慮到他沒(méi)有學(xué)到數(shù)據(jù)庫(kù)于是想到了存入文件
此版本使用的數(shù)組,第二個(gè)版本使用的是鏈表,鏈表是一個(gè)很好的數(shù)據(jù)結(jié)構(gòu),推薦大家用鏈表
第二版:鏈接
話不多說(shuō)上代碼
#include <stdio.h>
#include <stdlib.h>
#define USER_MAX 20
//此系統(tǒng)能存放最多的用戶(hù)數(shù)
typedef struct
{
char name[10];
char password[10];
} User;
//定義一個(gè)存放用戶(hù)的結(jié)構(gòu)體
User list[USER_MAX];
//定義一個(gè)全局?jǐn)?shù)組,類(lèi)型是User,大小是USER_MAX
char* filename = "user.txt";
//需要在你的程序目錄下新建一個(gè)user.txt文件
//登錄函數(shù)
User login()
{
char name[10];
char password[10];
User lg;
printf("enter name:");
scanf("%s",name);
strcpy(lg.name , name);
printf("enter password:");
scanf("%s",password);
strcpy(lg.password,password);
return lg;
}
//寫(xiě)入txt文件,每一行存在一個(gè)用戶(hù)
void writeToFile(User u)
{
FILE *fw = fopen(filename,"a+");
fprintf(fw,u.name);
fprintf(fw,"\t");
fprintf(fw,u.password);
fprintf(fw,"\n");
}
//判斷是否存在該用戶(hù)
int exist(User u)
{
int i;
for(i=0; i<USER_MAX; i++)
{
if(0==strcmp(list[i].name ,u.name) && 0==strcmp(list[i].password ,u.password))
{
return 1;
}
}
return -1;
}
//注冊(cè)用戶(hù)
void registerUser()
{
char name[10];
char password[10];
User user;
int i;
printf("enter your name:");
scanf("%s",name);
strcpy(user.name , name);
//判斷注冊(cè)的用戶(hù)是否已存在
for(i=0; i<USER_MAX; i++)
{
if(0==strcmp(list[i].name ,name))
{
printf("USER ALREADY EXIST");
return;
}
}
printf("enter your password:");
scanf("%s",password);
strcpy(user.password , password);
writeToFile(user);
}
int menu()
{
int choice;
printf("1.login\n");
printf("2.register\n");
printf("#.exit\n");
printf("enter your choice:");
scanf("%d",&choice);
return choice;
}
int main()
{
User test[USER_MAX];
FILE *fp = fopen(filename,"r");
int i=0;
User u;
if(NULL == fp)
{
printf("FILE NOT FOUND");
return -1;
}
for(i=0; i<USER_MAX; i++)
{
char uname[10];
char upassword[10];
fscanf(fp,"%s%s",uname,upassword);
strcpy(list[i].name , uname);
strcpy(list[i].password , upassword);
}
int choice = menu();
if(1 == choice)
{
system("cls");
u=login();
if(1 == exist(u))
{
printf("success");
}
else
{
printf("WRONG USER OR PASS");
}
}
else if(2 == choice)
{
system("cls");
registerUser();
}
else
{
return 0;
}
}
運(yùn)行結(jié)果
菜單,比較簡(jiǎn)陋,可以根據(jù)自己需求加?xùn)|西
PS我并未寫(xiě)循環(huán)語(yǔ)句,只是簡(jiǎn)單實(shí)現(xiàn)功能,所以讀者可根據(jù)需求寫(xiě)菜單的循環(huán)

注冊(cè)

看一下文件

登錄

異常路徑(登錄失敗)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言安全編碼之?dāng)?shù)值中的sizeof操作符
這篇文章主要介紹了C語(yǔ)言安全編碼的數(shù)值中的sizeof操作符用法注意事項(xiàng),需要的朋友可以參考下2014-07-07
簡(jiǎn)單談?wù)凜++ 頭文件系列之(algorithm)
<algorithm>是c++特有的STL模板的算法頭文件 包含了一些特定的算法函數(shù) 包括sort(),stable_sort(),partical_sort(),nth_element()等常用的算法函數(shù)2017-02-02
C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法使用解析
這篇文章主要為大家介紹了C語(yǔ)言庫(kù)函數(shù)qsort及bsearch快速排序算法的使用示例解析2022-02-02
C++基礎(chǔ)入門(mén)教程(五):new和delete
這篇文章主要介紹了C++基礎(chǔ)入門(mén)教程(五):new和delete,本文講解了動(dòng)態(tài)分配內(nèi)存、new和delete的配對(duì)、new、delete與reatin、release的關(guān)系、動(dòng)態(tài)數(shù)組等內(nèi)容,需要的朋友可以參考下2014-11-11
C++中volatile和mutable關(guān)鍵字用法詳解
這篇文章主要介紹了C++中volatile和mutable關(guān)鍵字用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
淺談C語(yǔ)言編程中的布爾bool數(shù)據(jù)類(lèi)型
這篇文章主要介紹了C語(yǔ)言編程中的布爾bool數(shù)據(jù)類(lèi)型,bool并不是需要通過(guò)C++才能使用的,需要的朋友可以參考下2015-11-11

