设备: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 1system("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->nextwhile(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");}elseif(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;}}elseif(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 类型指针dbUSER userHead;//定义USER 结构体头指针并初始化init_userHead(&userHead);int count = 0;//记录密保答案回答次数char *errmsg;//定义指针errmsgchar 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->nextwhile(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 类型指针dbchar *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;//定义临时指针指向*headLink 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 指向newlistnewlist->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 类型指针dbchar *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 1if(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);
#endifreturn 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 类型指针dbLink temp = (*head)->next;//定义结构体指针temp 指向 头指针的nextchar 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

(Linux)简单电子通讯录相关推荐

  1. C语言实现简单的电子通讯录2

    这两天学完系统调用和标准IO,之前的通讯录可以进行一些改进,将数据保存到文件中(图我这里就不发了). 原理:每次启动程序时先从预设文件中以只读的形式读取保存的通讯录信息,然后将读取到的信息导入到结构体 ...

  2. python课程设计编写电子通讯录_用Python实现简单通讯录

    一个简单的通讯录例子 #!/usr/bin/python __author__ = 'fierce' #coding:utf-8 import os #引用os模块 import pickle #应用 ...

  3. C编程实践:简单的通讯录

    分享一个之前学C语言时练习写的一个简单的通讯录程序.程序功能: 1.添加联系人信息(姓名.电话号码.城市.公司). 2.保存联系人信息至本地文件. 3.打印输出联系人列表. 4.删除某个联系人信息或删 ...

  4. 在linux中运行电子词典,《Linux下电子词典的设计和实现》.doc

    <Linux下电子词典的设计和实现> 毕业设计(论文) 题目:Linux下电子词典的设计与实现 2014 年 11月 20日 大学毕业设计(论文)任务书 学院(直属系):电子信息工程系 时 ...

  5. 基于JAVA的电子通讯录+源码+毕业设计+课程设计

    源码地址:JAVA+SQL+电子通讯录+源码+毕业设计 随着信息时代的到来,人们越来越注重通讯方式的快捷性和高效性.在这样的背景下,电子通讯录应运而生,成为人们生活中不可或缺的工具.在这篇文章中,我们 ...

  6. Linux简单安装Mysql+Apach+PHP+phpMyAdmin

    Linux简单安装Mysql+Apach+PHP+phpMyAdmin 2008年06月02日 星期一 上午 01:00 从网上看到许多Apache+Mysql+PHP的安装文档,但有的总是会有写错误 ...

  7. 简单的通讯录程序系统python

    用python做一个简单的通讯录程序系统 主要功能∶ 1.查询联系人资料 2.插入新的联系人 3.删除已有联系人 4.退出通讯录程序 print('''|---欢迎进入通讯录程序---| |---1. ...

  8. 用结构体写一个简单的通讯录

    一个简单的通讯录 通讯录应该具备简单的一些功能 1 增添联系人 2 删除联系人 3 查找联系人 4 修改联系人 5 按名字给联系人排序 6 查看通讯录 除此之外,应该在实现上还应该具备一些其他的功能函 ...

  9. [原创]linux简单之美(二)

    原文链接:linux简单之美(二) 我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用C标准库中的函数快速做一些"复杂"的事: 1 section ...

  10. 交叉编译及linux简单程序设计,嵌入式实验6交叉编译及Linux简单程序设计实验

    实验六交叉编译及Linux简单程序设计实验的实验报告 一实验目的 1.了解和掌握交叉编译模式和方法: 2.熟悉和掌握Linux简单程序设计. 二实验环境 预装Fedora10_A8_Linux的pc机 ...

最新文章

  1. DHCP服务器在企业网中的应用
  2. 望岳物业APP开发过程
  3. vue 生命周期_Vue 生命周期
  4. 分布式理论:CAP是三选二吗?
  5. Spartacus image alt属性的绑定实现
  6. mongodb php 扩展 linux,CentOS Linux 安装PHP的MongoDB扩展
  7. vue vuex 大型项目demo示例
  8. matlab可以使用词云分析吗,利用豆瓣短评数据生成词云
  9. 润乾报表 数据集ds1中,数据源xmglxt_x3无数据库连接,且未设定数据连接工厂,请检查数据源设定:...
  10. 五问唐骏:泡妞真的如你说的那么容易?
  11. c语言表达式求值的空间复杂度,373-时间复杂度(表达式求值)
  12. Ubuntu 12.04下安装搜狗拼音 + 安装搜狗皮肤-转
  13. Mysql的master,slave的配置
  14. linux ls-la/boot,CentOS系统启动/boot/vmlinuz修复(实验)
  15. Cocos2D场景编辑器
  16. simulink入门
  17. Excel表格进行10进制/16进制换算
  18. apng java,免费的APNG、WebP格式转换工具-iSparta
  19. 实验二 —— 串口通信
  20. 84 R CRM and Credit Risk介绍

热门文章

  1. nvidia卸载程序无法继续运行_nvidia安装程序无法继续 不兼容怎么办 nvidia安装程序无法继续安装怎么办...
  2. 数字经济时代,企业的核心竞争力究竟是什么?
  3. python逆时针旋转矩阵_由外向内顺时针逆时针旋转矩阵
  4. 一款优秀的IT资产管理系统-Snipe-IT 安装及用户手册中文版(二配置使用篇)
  5. 你曾后悔进入 IT 行业吗?
  6. office2019选框虚线_手把手教你分析PS2019里怎么画虚线
  7. 电脑启动计算机管理闪退,win7系统控制面板无法打开出现闪退的设置方案
  8. Windows“控制面板”在哪?win10怎么打开控制面板(快捷方法)打开控制面板的多种方法都在这里
  9. HFSS仿真结果导出为SNP文件
  10. python代码编程教学无限循环_代码陷入无限循环