(Linux)简单电子通讯录

设备: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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值