设备:VMware虚拟机(Redhat镜像)
电子通讯录
功能:1.用户的注册
2.用户登录
3.用户修改密码
4.忘记密码,找回
5.退出程序
6.用户是否存在检查
7.密码是否正确检查
8.用户个人通讯录的信息管理
① 添加成员信息
② 查看成员信息
③ 查找成员信息
④ 删除成员信息
简介:此电子通讯录对用户好友数据的读取和写入,采用最简单的一次性读取全部内容后删除原数据库表,写入时新建空表写入数据库。譬如:添加成员信息,如果添加完毕后没用正常退出,而是ctrl+z(Linux下)退出,那么添加的成员数据不会保存。所以无法做到实时的操作和更新。由于作者也是新手,所以进步空间旷比碧空。
注意:命令输入一定是英文状态下!
完整的文件在此地址(百度云):
https://pan.baidu.com/s/1bNkopo1u4K4g30iB4h0iOQ
可供参考的截图:
主菜单
注册新用户菜单
登录用户名不存在提示
登陆成功!
用户数据管理菜单
显示写入数据
查看用户操作日志
查看数据库数据(sqlite3 库名)
部分程序参考
main 函数
#include "../../include/myhead.h"//指定目录下寻找自定义头文件
int main()
{
char *user = (char *)malloc(sizeof(char) * 20);
char opt[20];
int fun = 0;/*定义整型变量,来变向判断输入字符串的含义*/
int count = 0;/*定义整型变量,来记录删除时重名人的个数*/
int delete_ID;/*定义整型变量,来读取键盘输入的要删除的人的ID*/
int judge_name = 0;/*定义整型变量,来标记数据已有的名字和键盘输入的名字是否相同*/
int search_result;/*定义整型变量,来记录 search_list 函数的返回值*/
//int result_delete;
char go_on;/*定义字符变量,来记录键盘输入是否继续添加成员*/
char * function = (char *)malloc(MAX_LEN);/*定义字符串指针并初始化,记录键盘输入的功能选择字符串*/
char * search_name = (char *)malloc(MAX_LEN);/*定义字符串并初始化,记录键盘输入的名字*/
char * delete_name = (char *)malloc(MAX_LEN);/*定义字符串并初始化,记录删除的名字*/
Link head;/*定义head指针并初始化*/
init_head(&head);
Link find_head;/*定义find_head指针并初始化*/
init_head(&find_head);
Link newlist;/*定义newlist指针*/
interface(&head,&user);
// login_screen();
//read_listLib(&head);
system("clear");/*清屏*/
while(1)/*死循环*/
{
menu();/*调用菜单函数*/
//display_list(head);
printf("\t\t\t\t\t\t\t请输入您的操作: ");
scanf("%s",function);
if(my_strcmp(function,"add") == 0)/*如果function 为 add,则 fun 为 ADD(宏)*/
{
get_time();//调用获取时间函数
memset(opt,0,sizeof(opt));//清空记录 操作 的字符串
sprintf(opt,"%s|add",user);//拼装字符串
write_file(opt);//把字符串写入文件
fun = ADD;
}
if(my_strcmp(function,"search") == 0)//如果function 为 search,则 fun 为 SEARCH(宏)
{
get_time();//调用获取时间函数
memset(opt,0,sizeof(opt));//清空记录 操作 的字符串
sprintf(opt,"%s|search",user);//拼装字符串
write_file(opt);//把字符串写入文件
fun = SEARCH;
}
if(my_strcmp(function,"display") == 0)//如果function 为 display,则 fun 为 DISPLAY(宏)
{
get_time();//调用获取时间函数
memset(opt,0,sizeof(opt));//清空记录 操作 的字符串
sprintf(opt,"%s|display",user);//拼装字符串
write_file(opt);//把字符串写入文件
fun = DISPLAY;
}
if(my_strcmp(function,"delete") == 0)//如果function 为 delete,则 fun 为 DELETE(宏)
{
get_time();
memset(opt,0,sizeof(opt));
sprintf(opt,"%s|delete",user);
write_file(opt);
fun = DELETE;
}
if(my_strcmp(function,"quit") == 0)//如果function 为 quit,则 fun 为 QUIT(宏)
{
get_time();
memset(opt,0,sizeof(opt));
sprintf(opt,"%s|quit",user);
write_file(opt);
fun = QUIT;
}
if((my_strcmp(function,"add") != 0) && (my_strcmp(function,"search") != 0) && (my_strcmp(function,"delete") != 0) && (my_strcmp(function,"display") != 0) && (my_strcmp(function,"quit") != 0))//如果function 为 error,则 fun 为 ERROR(宏)
{
get_time();
memset(opt,0,sizeof(opt));
sprintf(opt,"%s|error",user);
write_file(opt);
fun = ERROR;
}
printf("\n");//换行,此后单独出现此行都是换行;
switch(fun)//判断fun
{
case ADD://fun为ADD,执行一下操作
{
loop:
newlist = (Link)malloc(sizeof(Address));//给newlist分配空间
//newlist->name = (char *)malloc(MAX_LEN);//给newlist->name newlist->home_address newlist->phone_number 分配空间
//newlist->home_address = (char *)malloc(MAX_LEN * 5);
//newlist->phone_number = (char *)malloc(MAX_LEN);
printf("\n");
printf("\t\t\t\t\t\t\t请输入姓名: ");
scanf("%s",newlist->name);
printf("\n");
printf("\t\t\t\t\t\t\t请输入 ID: ");
scanf("%d",&newlist->ID);
printf("\n");
printf("\t\t\t\t\t\t\t请输入家庭地址: ");
scanf("%s",newlist->home_address);
printf("\n");
printf("\t\t\t\t\t\t\t请输入手机号码: ");
scanf("%s",newlist->phone_number);
insert_tail_list(newlist,&head);
printf("\n");
loop1:
printf("\t\t\t\t\t\t\t是否继续添加?(y/n)");
getchar();//去掉字符"\n"
scanf("%c",&go_on);
if(go_on == 'y')
{
goto loop;
}
if(go_on == 'n')
{
system("clear");
printf("\n");
printf("\n");
display_list(head);
printf("\n");
wait();
break;
}
else
{
printf("\n");
printf("\t\t\t\t\t\t\t\t\033[31m操作错误\033[0m\n");
printf("\n");
wait();
system("clear");
printf("\n");
goto loop1;
}
break;
}
case SEARCH://如果为查找,执行一下操作
{
system("clear");
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t请输入您要查找的姓名:");
scanf("%s",search_name);
search_result = search_list(&head,&find_head,&search_name);//调用search_list 函数
// display_list(find_head);
if(search_result == Search_fail)//返回值search_result 为 Search_fail 则输出查找失败
{
printf("\n");
printf("\t\t\t\t\t\t\t\t\033[31m查找失败!\033[0m\n");
printf("\n");
wait();
break;
}
if(search_result == Search_success)//返回值search_result 为 Search_success 则输出查找结果,掉用display_list 函数
{
printf("\n");
printf("\t\t\t\t\t\t\t\t查找结果:\n");
display_list(find_head);
find_head->next = find_head;//把find_head 指针指向 find_head,清除find_head 链表的数据
printf("\n");
wait();
break;
}
if(search_result == Search_empty)//返回值search_result 为 Search_empty 则输出没有您要找的信息!
{
printf("\n");
printf("\t\t\t\t\t\t\t\t\033[31m没有您要找的信息!\033[0m\n");
printf("\n");
wait();//实现按任意键继续
printf("\n");
break;
}
}
case DISPLAY:
{
system("clear");//清屏
display_list(head);//调用display_list函数
printf("\n");
wait();
break;//退出 swtich 循环
}
case DELETE:
{
#if 1
system("clear");
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\t\t请输入姓名: ");
scanf("%s",delete_name);
Link temp = head->next;//定义临时指针temp 指向head->next
while(temp != head)//遍历链表,实现记录与输入同名人的个数
{
judge_name = my_strcmp(temp->name,delete_name);//取strcmp判断后的返回值
if(judge_name == 0)//返回值为 0 记录一次
{
count++;
}
temp = temp->next;
}
temp = head->next;//把临时指针指回 head->next;
if(count == 0)//如果计数为 0 则没有该好友信息
{
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\033[31m没有该好友信息!\033[0m\n");
printf("\n");
wait();
system("clear");
}
else
if(count == 1)//如果计数为 1 则直接删除该成员的节点
{
while(temp != head)
{
judge_name = my_strcmp(temp->name,delete_name);
if(judge_name == 0)
{
delete_list(&head,temp->ID);
}
temp = temp->next;
}
}
else
if(count > 1)//如果计数大于 1 则需要读取键盘输入的ID,遍历链表删除此ID 的节点
{
while(temp != head)//遍历链表输出重名的人的信息
{
judge_name = my_strcmp(temp->name,delete_name);
if(judge_name == 0)
{
Link find_list = (Link)malloc(sizeof(Address));
my_strcpy(find_list->name,temp->name);
find_list->ID = temp->ID;
my_strcpy(find_list->home_address,temp->home_address);
my_strcpy(find_list->phone_number,temp->phone_number);
insert_tail_list(find_list,&find_head);
}
temp = temp->next;
}
display_list(find_head);
find_head->next = find_head;
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\t请输入您要删除的人的ID:");
scanf("%d",&delete_ID);
delete_list(&head,delete_ID);
}
system("clear");
printf("\n");
display_list(head);
printf("\n");
wait();
break;
#endif
}
case QUIT:
{
char n;
system("clear");
loop2:
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\t是否保存所有操作?(y/n) ");//判断用户是否保存所有操作
getchar();//去出行缓冲内的影响
scanf("%c",&n);
system("clear");//清屏
if(n == 'y')
{
write_listLib(&head,&user);
printf("\n");
printf("\t\t\t\t\t\t\t\t***********************\n");
printf("\t\t\t\t\t\t\t\t** \033[32m已 成 功 退 出 !\033[0m **\n");
printf("\t\t\t\t\t\t\t\t***********************\n");
printf("\n");
return 0;
}
if(n == 'n')
{
printf("\n");
printf("\t\t\t\t\t\t\t\t***********************\n");
printf("\t\t\t\t\t\t\t\t** \033[32m已 成 功 退 出 !\033[0m **\n");
printf("\t\t\t\t\t\t\t\t***********************\n");
printf("\n");
return 0;
}
else
{
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\t\033[31m输入错误!\033[0m\n");
wait();
system("clear");
printf("\n");
goto loop2;
}
}
default:
{
system("clear");
printf("\n");
printf("\t\t\t\t\t\t\t\t\033[31m输入错误!\033[0m\n");
printf("\n");
wait();
system("clear");
printf("\n");
break;
}
}
}
return 0;
}
interface(主菜单函数)
#include "../../include/myhead.h"//指定目录下寻找自定义头文件
int interface(Link *head,char **user)//定义主菜单函数
{
char order[10];//读取用户输入命令
interface:
while(1)//死循环输出菜单栏
{
system("clear");
memset(order,0,sizeof(order));
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t ————————————————————————————————————————————————————————\n");
printf("\t\t\t\t\t\t\t| |\n");
printf("\t\t\t\t\t\t\t| 欢 迎 使 用 电 子 通 讯 录 |\n");
printf("\t\t\t\t\t\t\t| |\n");
printf("\t\t\t\t\t\t\t ————————————————————————————————————————————————————————\n");
printf("\t\t\t\t\t\t\t| |\n");
printf("\t\t\t\t\t\t\t| 1.注 册 帐 号(reg) |\n");
printf("\t\t\t\t\t\t\t| 2.登 录 帐 号(log) |\n");
printf("\t\t\t\t\t\t\t| 3.修 改 密 码(mod) |\n");
printf("\t\t\t\t\t\t\t| 4.找 回 密 码(bak) |\n");
printf("\t\t\t\t\t\t\t| 5. 退 出(exit) |\n");
printf("\t\t\t\t\t\t\t| |\n");
printf("\t\t\t\t\t\t\t| 请输入您的操作: |\n");
printf("\t\t\t\t\t\t\t ————————————————————————————————————————————————————————\n");
printf("\t\t\t\t\t\t\t \033[2A");
scanf("%s",order);
if(my_strcmp(order,"reg") == 0)//如果命令为reg 则注册帐号
{
reg_ID();//调用注册帐号函数
wait();//等待函数
login_screen(head,user);//登录用户函数
break;//退出死循环
}
if(my_strcmp(order,"log") == 0)//如果命令为log 登录帐户
{
login: login_screen(head,user);
return 0;
}
if(my_strcmp(order,"mod") == 0)//如果命令为mod 修改密码
{
mod_password();//调用修改密码函数
}
if(my_strcmp(order,"bak") == 0)//如果命令为bak 找回密码
{
sqlite3 *db;//定义sqlite3 类型指针db
USER userHead;//定义USER 结构体头指针并初始化
init_userHead(&userHead);
int count = 0;//记录密保答案回答次数
char *errmsg;//定义指针errmsg
char bak_user[20];
char answer[20];//读取用户输入密保答案
//char password[20];//读取数据库里的密码
if(sqlite3_open("data.db",&db) != SQLITE_OK)
{
printf("\n");
printf("\t\t\t\t\t\t\t\033[31msqlite open error!\033[0m\n");
exit(1);
}
bakPassword:
system("clear");
//memset(password,0,sizeof(password));
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t ____________________________________________________\n");
printf("\t\t\t\t\t\t\t| |\n");
printf("\t\t\t\t\t\t\t|请输入用户名: |\n");
printf("\t\t\t\t\t\t\t ____________________________________________________|\n");
printf("\t\t\t\t\t\t\t|问题:您最喜欢吃的水果是?比如 苹果 : |\n");
printf("\t\t\t\t\t\t\t|____________________________________________________|\n");
printf("\t\t\t\t\t\t\t \033[4A");
memset(answer,0,sizeof(answer));//清空数组数据
scanf("%s",bak_user);
sqlite3_exec(db,"select * from userdata",get_user,&userHead,&errmsg);//读取数据库 userdata 表中的数据给 USER 结构体链表
USER temp = userHead->next;//temp指向userHead->next
while(temp != userHead)//遍历链表寻找用户输入的用户名,没有的华输出不存在此用户
{
if(my_strcmp(temp->user,bak_user) == 0)//找到用户名则输出此用户名存在并跳出循环到输入密码
{
printf("\t\t\t\t\t\t\t\t\t\t\t\033[1A");
printf("\033[32m存在此用户\033[0m");
goto InputAnswer;
}
temp = temp->next;
}
printf("\t\t\t\t\t\t\t\t\t\t\t\033[1A");//遍历完都没有找到则跳转到菜单
printf("\033[31m不存在此用户!\033[0m");
printf("\t\t任意键继续 ");
getchar();
getchar();
goto bakPassword;
InputAnswer:
printf("\n");
printf("\t\t\t\t\t\t\t________________________________________\033[1B");
scanf("%s",answer);
USER t = userHead->next;
while(t != userHead)
{
if((my_strcmp(t->user,bak_user) == 0) && (my_strcmp(t->answer,answer) == 0))//如果答案正确,输出原密码
{
count = 0;
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t原密码为: %s",t->password);
wait();
goto login;
}
t = t->next;
}
system("clear");
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\033[31m答案错误!请重新输入\033[0m\n");
count++;
if(count > 4)//如果答案错误重新输入,但输入次数到5次 则不允许继续输入,跳转到菜单
{
count = 0;
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\033[31m因为多次错误所以不可以再继续猜!\033[0m\n");
wait();
goto interface;
}
wait();
goto bakPassword;
}
if(my_strcmp(order,"exit") == 0)//如果输入命令为exit 直接退出程序
{
printf("\n");
exit(0);
}
else//否则输入错误重新回到主菜单
{
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\033[31m输入错误,请 重 新 输 入!\033[0m\n");
printf("\n");
wait();
}
}
return 0;//函数结束返回0
}
login_screen(登陆菜单函数)有三五行与完全版有点差别,以链接百度云地址为主!
#include "../../include/myhead.h"//指定目录下寻找自定义头文件
int login_screen(Link *head,char **user)//定义登录函数
{
USER userHead;//定义user 结构体 USER 头指针
init_userHead(&userHead);//初始化头指着
sqlite3 *db;//定义sqlite3 类型指针db
char *errmsg;//定义字符指针
char key[20];//读取用户输入密码
char sql[1024];//命令字符串
char name[20];//读取用户输入用户名
memset(key,0,sizeof(key));
if(sqlite3_open("data.db",&db) != SQLITE_OK)//打开数据库,打开失败提示,并退出程序
{
printf("\n");
printf("\t\t\t\t\t\t\t\033[31msqlite open error!\033[0m\n");
exit(1);
}
login:
while(1)//死循环输出菜单
{
system("clear");
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t************************************************************\n");
printf("\t\t\t\t\t\t\t** **\n");
printf("\t\t\t\t\t\t\t** 欢迎使用电子通讯录 **\n");
printf("\t\t\t\t\t\t\t** **\n");
printf("\t\t\t\t\t\t\t------------------------------------------------------------\n");
printf("\t\t\t\t\t\t\t| 请输入用户名: |\n");
printf("\t\t\t\t\t\t\t| 请输入密码: |\n");
printf("\t\t\t\t\t\t\t| (不超过16位) |\n");
printf("\t\t\t\t\t\t\t| 初始密码:123456 |\n");
printf("\t\t\t\t\t\t\t------------------------------------------------------------\n");
printf("\t\t\t\t\t\t\t \033[5A");
scanf("%s",name);
my_strcpy(*user,name);//记录用户名
sqlite3_exec(db,"select * from userdata",get_user,&userHead,&errmsg);//读取数据库 userdata表的数据
USER temp = userHead->next;
while(temp != userHead)//遍历寻找用户输入的用户名
{
if(my_strcmp(temp->user,name) == 0)//找到输出存在此用户,跳转到输入密码
{
printf("\t\t\t\t\t\t\t\t\t\t\t\033[1A");
printf("\033[32m存在此用户\033[0m");
goto inputPassword;
}
temp = temp->next;
}
printf("\t\t\t\t\t\t\t\t\t\t\t\033[1A");//遍历结束没找到则输出不存在此用户,按任意键返回菜单
printf("\033[31m不存在此用户!\033[0m");
printf("\t任意键继续 ");
getchar();
getchar();
goto login;
inputPassword:
sprintf(sql,"select * from userdata where name = '%s'",name);
sqlite3_exec(db,sql,get_log,NULL,&errmsg);
memset(sql,0,sizeof(sql));
sprintf(sql,"create table %s (ID integer primary key,name text,home_address text,phone_number text)",name);
sqlite3_exec(db,sql,NULL,NULL,&errmsg);
memset(sql,0,sizeof(sql));
sprintf(sql,"select * from %s",name);
sqlite3_exec(db,sql,get_result,head,&errmsg);
memset(sql,0,sizeof(sql));
break;
}
return 0;
}
delete (删除成员信息函数)
#include "../../include/myhead.h"//指定目录下寻找自定义数据库
int delete_list(Link *head,int ID)//定义delete_list函数,返回值为整型,形参为Link *head,int ID
{
Link temp = (*head)->next;//定义临时指针指向*head
Link p = *head;//定义指针指向temp,一下操作会形成前后指针
while(temp != *head)//遍历链表删除ID为参数ID的链表节点
{
if(temp->ID == ID)
{
p->next = temp->next;
free(temp);//释放节点数据
temp = NULL;//指针temp置空,防止出现野指针
return Delete_success;//返回Delete_success(宏)
}
p = temp;//形成前后指针
temp = temp->next;
}
return Delete_fail;//如果没找到此ID 返回Delete_fail
}
链表尾插函数(单项循环链表)
#include "../../include/myhead.h"//指定目录下寻找自定义头文件
void insert_tail_list(Link newlist,Link *head)//定义尾插节点函数
{
Link temp = *head;
while(temp->next != *head)//找到链表的末尾
{
temp = temp->next;
}
temp->next = newlist;//temp->next 指向newlist
newlist->next = *head;//新节点指向头指针,形成单向循环链表
}
修改密码函数
#include "../../include/myhead.h"//指定目录下寻找自定义头文件
int mod_password()//定义修改密码函数
{
sqlite3 *db;//定义sqlite3 类型指针
char *errmsg;//定义字符指针
char password[20];//读取用户输入的密码
char password1[20];//读取用户输入的密码,判断两次输入是否一致
char sql[1024];//定义命令字符串数组
char user[20];//读取用户输入的用户名
USER userHead;//定义头指针并初始化
init_userHead(&userHead);
if(sqlite3_open("data.db",&db) != SQLITE_OK)//打开数据库,打开失败提示并直接退出程序
{
printf("\n");
printf("\t\t\t\t\t\t\t\033[31msqlite open error!\033[0m\n");
exit(1);
}
reInput:
while(1)//死循环输出菜单
{
system("clear");
memset(password,0,sizeof(password));
memset(password1,0,sizeof(password1));
printf("\n");
printf("\t\t\t\t\t\t\t ————————————————————————————————————————————————————————————\n");
printf("\t\t\t\t\t\t\t| 修 改 密 码 |\n");
printf("\t\t\t\t\t\t\t|—————————————————————————————————————————————————————————————|\n");
printf("\t\t\t\t\t\t\t| 请输入用户名: |\n");
printf("\t\t\t\t\t\t\t|—————————————————————————————————————————————————————————————|\n");
printf("\t\t\t\t\t\t\t| 最多16位 |\n");
printf("\t\t\t\t\t\t\t| 请输入新的密码: |\n");
printf("\t\t\t\t\t\t\t|—————————————————————————————————————————————————————————————|\n");
printf("\t\t\t\t\t\t\t| 请确认新的密码: |\n");
printf("\t\t\t\t\t\t\t ————————————————————————————————————————————————————————————\n");
printf("\t\t\t\t\t\t\t \033[7A");
scanf("%s",user);
sqlite3_exec(db,"select * from userdata",get_user,&userHead,&errmsg);//读取数据库 userdata 表中的数据
USER temp = userHead->next;
while(temp != userHead)//遍历寻找用户输入的用户名,找到便输入密码
{
if(my_strcmp(temp->user,user) == 0)
{
printf("\t\t\t\t\t\t\t\t\t\t\t\033[1A");
printf("\033[32m存在此用户\033[0m");
goto inputPassword;
}
temp = temp->next;
}
printf("\t\t\t\t\t\t\t\t\t\t\t\033[1A");//没找到就提示并返回菜单
printf("\033[31m不存在此用户!\033[0m");
printf("\t任意键继续 ");
getchar();
getchar();
goto reInput;
inputPassword:
printf("\n");
printf("\t\t\t\t\t\t\t|———————————————————————\033[2B");
scanf("%s",password1);
printf("\t\t\t\t\t\t\t|———————————————————————\033[1B");
scanf("%s",password);
if(my_strcmp(password,password1) == 0)//如果输入的两次密码一致则修改成功,退出循环
{
sprintf(sql,"update userdata set password = '%s' where name = '%s'",password,user);
sqlite3_exec(db,sql,NULL,NULL,&errmsg);
memset(sql,0,sizeof(sql));
sqlite3_close(db);
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t\033[32m修 改 成 功 !\033[0m");
wait();
return 0;
}
else//否则继续下一次循环
{
printf("\n");
printf("\t\t\t\t\t\t\033[31m输入密码不一致! 请 重 新 输 入\033[0m\n");
wait();
continue;
}
}
return 0;
}
注册用户函数
#include "../../include/myhead.h"//指定目录下寻找自定义头文件
int reg_ID()//定义注册用户函数
{
USER userHead;
init_userHead(&userHead);
sqlite3 *db;//定义sqlite3 类型指针db
char *errmsg;//定义字符指针
char newname[20];//读取用户输入用户名
char password[20];//读取用户输入的密码
//char question[100];
char answer[20];//读取用户输入的密保答案
char order[1024];//命令字符串
memset(newname,0,sizeof(newname));//清空所有数组的数据
memset(password,0,sizeof(password));
//memset(question,0,sizeof(question));
memset(answer,0,sizeof(answer));
regID:
while(1)//死循环输出菜单
{
system("clear");
memset(newname,0,sizeof(newname));
memset(password,0,sizeof(password));
//memset(question,0,sizeof(question));
memset(answer,0,sizeof(answer));
printf("\n");
printf("\n");
printf("\t\t\t\t\t\t\t ---------------------------------------------------------\n");
printf("\t\t\t\t\t\t\t| 注 册 新 用 户 |\n");
printf("\t\t\t\t\t\t\t| |\n");
printf("\t\t\t\t\t\t\t|---------------------------------------------------------|\n");
printf("\t\t\t\t\t\t\t| 输入用户名: |\n");
printf("\t\t\t\t\t\t\t|---------------------------------------------------------|\n");
printf("\t\t\t\t\t\t\t| 输入 密码: |\n");
printf("\t\t\t\t\t\t\t|---------------------------------------------------------|\n");
printf("\t\t\t\t\t\t\t| 密 保 问题: 您最喜欢吃的水果是什么? |\n");
printf("\t\t\t\t\t\t\t|---------------------------------------------------------|\n");
printf("\t\t\t\t\t\t\t| 密报问题答案: |\n");
printf("\t\t\t\t\t\t\t ---------------------------------------------------------\n");
printf("\t\t\t\t\t\t\t \033[8A");
scanf("%s",newname);
printf("\t\t\t\t\t\t\t|-------------------\033[1B");
scanf("%s",password);
//my_strcpy(password,getpass(""));
//hide_password(password);
// printf("\t\t\t\t\t\t\t|-------------------\033[1B");
// scanf("%s",question);
printf("\t\t\t\t\t\t\t|-------------------\033[3B");
scanf("%s",answer);
break;
}
#if 1
if(sqlite3_open("data.db",&db) != SQLITE_OK)
{
printf("\n");
printf("\t\t\t\t\t\t\t\033[31msqlite open error!\033[0m\n");
exit(1);
}
memset(order,0,sizeof(order));
sqlite3_exec(db,"select * from userdata",get_user,&userHead,&errmsg);
USER temp = userHead->next;
while(temp != userHead)
{
if(my_strcmp(temp->user,newname) == 0)
{
printf("\n");
printf("\t\t\t\t\t\t\t\033[31m该 用 户 名 已 经 存 在!\033[0m\n");
printf("\n");
wait();
goto regID;
}
temp = temp->next;
}
sqlite3_exec(db,"create table userdata (name text primary key,password text,answer text)",NULL,NULL,&errmsg);
sprintf(order,"insert into userdata (name,password,answer) values ('%s','%s','%s')",newname,password,answer);
sqlite3_exec(db,order,NULL,NULL,&errmsg);
memset(order,0,sizeof(order));
sprintf(order,"create table %s (ID integer primary key,name text,home_address text,phone_number text)",newname);
sqlite3_exec(db,order,NULL,NULL,&errmsg);
printf("\n");
printf("\t\t\t\t\t\t\t\033[32m注 册 成 功 !\033[0m\n");
sqlite3_close(db);
#endif
return 0;
}
查找指定成员信息函数
#include "../../include/myhead.h"
int search_list(Link *head,Link *find_head,char **name)//定义查找函数,返回值为整型
{
int count = 0;//定义整型变量,记录重名人的个数
Link temp = (*head)->next;
if((*head)->next == *head)//没有数据返回查找失败
{
return Search_fail;
}
else
{
while(temp != *head)//遍历链表查找姓名
{
if(my_strcmp(temp->name,*name) == 0)//找到姓名就新建一个链表把找到的信息加入信=新链表
{
count++;
Link find_list = (Link)malloc(sizeof(Address));
my_strcpy(find_list->name,temp->name);
find_list->ID = temp->ID;
my_strcpy(find_list->home_address,temp->home_address);
my_strcpy(find_list->phone_number,temp->phone_number);
insert_tail_list(find_list,&(*find_head));
}
temp = temp->next;
}
if(count == 0)//没找到姓名数据
{
return Search_empty;
}
else//否则返回成功
{
return Search_success;
}
}
}
写入数据库函数
#include "../../include/myhead.h"//指定目录下寻找自定义头文件
int write_listLib(Link *head,char **user)//定义写入数据库函数
{
char name[20];
my_strcpy(name,*user);
sqlite3 *db;//定义sqlite3 类型指针db
Link temp = (*head)->next;//定义结构体指针temp 指向 头指针的next
char order[1024];//定义命令数组
char *errmsg;
memset(order,0,sizeof(order));//清空数组数据
if(sqlite3_open("data.db",&db) != SQLITE_OK)//打开数据库,打开失败提示,并退出程序
{
printf("\t\t\t\t\t\t\t\033[31msqlite open error!\033[0m\n");
exit(1);
}
sprintf(order,"drop table %s",name);//删除原表
sqlite3_exec(db,order,NULL,NULL,&errmsg);
memset(order,0,sizeof(order));
sprintf(order,"create table %s (ID integer primary key,name text,home_address text,phone_number text)",name);//新建空的表
sqlite3_exec(db,order,NULL,NULL,&errmsg);
memset(order,0,sizeof(order));
while(temp != *head)//遍历链表写入数据库
{
sprintf(order,"insert into %s (ID,name,home_address,phone_number) values (%d,'%s','%s','%s')",name,temp->ID,temp->name,temp->home_address,temp->phone_number);//拼装写入数据命令字符串
sqlite3_exec(db,order,NULL,NULL,&errmsg);
memset(order,0,sizeof(order));
temp = temp->next;
}
sqlite3_close(db);//数据写完关闭数据库
return WRITE_LISTLIB_OK;//函数执行完毕返回 表示写入完毕
}
1024