- #include <stdio.h>#include <string.h>#include <stdlib.h>#include <sqlite3.h>#define MAX_LEN 1000//宏定义#define NAME_LEN 20#define NODE "\e[0m"#define BLACK "\e[0;30m"#define L_BLACK "\e[1;30m"#define RED "\e[0;31m"#define L_RED "\e[1;31m"enum HUANSHU //枚举类型,避免case语句中出现幻数,从第壹个值依次累加{QUIT=0,ADD, DISPLAY,//逗号SEARCH, DELETe,MODIFY,};struct student { char name[NAME_LEN];int age; char sex;};typedef struct student STU;int person = 0; int get_result(void *para, int column_count, char *column_value[], char *column_name[]){ int i; for(i = 0; i < column_count; i ++){ printf("%s|",column_name[i]);}printf("\n"); for(i = 0; i < column_count; i ++) { printf("%s |",column_value[i]);}printf("\n");return 0;} void menu()//菜单{ printf("---------------------------------------------------\n"); printf("-------------------\033[0;34m通讯录\033[0m------------------------\n");printf("\n************\033[1;34m1、添加联系人信息\033[0m****************\n\n"); printf("\n\n************\033[1;34m2、查看所有联系人\033[0m****************\n\n");printf("\n\n************\033[1;34m3、搜索联系人信息\033[0m****************\n\n");printf("\n\n************\033[1;34m4、删除联系人信息\033[0m****************\n\n");printf("\n\n************\033[1;34m5、修改联系人信息\033[0m****************\n\n"); printf("\n\n------------\033[1;34m0、退出\033[0m----------------------------\n"); printf("-----------------------------------------------\n");} void modify(STU *str[])//修改信息{ int i; char arry[NAME_LEN]; printf("请输入要修改得联系人得名字:\n"); scanf("%s",arry); for(i=0;i<person;i++) { if(strcmp(str[i]->name,arry)==0){ printf("联系人信息: name age sex\n"); printf(" -------------------------\n"); printf(" %s %d %c\n",str[i]->name,str[i]->age,str[i]->sex); printf(" -------------------------\n"); printf("请输入更改后此人得信息:\n"); printf("age:");//不加'\n',scanf接在后面输入,没有换行scanf("%d",&(str[i]->age));printf("sex:");getchar();scanf("%c",&(str[i]->sex));printf("\033[0;32m修改成功!\033[0m\n");return;}}printf("\033[0;31m修改失败!不存在该联系人\033[5m");// \033[0;31m红色printf("\033[0m\n");//关闭颜色return;}//添加联系人void add(STU *str[])//指针数组{int num;char ch; printf("please input information:\n");while(1){ str[person] = (STU *)malloc(sizeof(STU));printf("姓名:");scanf("%s",str[person]->name);printf("年龄:");scanf("%d",&(str[person]->age));getchar();printf("性别:");scanf("%c",&(str[person]->sex));if(str[person]->sex != 'm'&& str[person]->sex != 'f'){ free(str[person]); printf("\033[0;31m[输入信息有误,请重新输入!]\033[0m\n"); continue; }sqlite3 *db;char *errmsg;//打开数据库if(sqlite3_open("test.db",&db) != SQLITE_OK){ printf("open db error!\n"); exit(1);}//数据库,创建表和插入数据char sql[100] = "create table student(name text primary key,age integer,sex text)"; sqlite3_exec(db,sql,NULL,NULL,&errmsg);//执行sql语句memset(sql,0,sizeof(sql)); sprintf(sql,"insert into student(name,age,sex) values('%s',%d,'%c')",str[person]->name,str[person]->age,str[person]->sex); sqlite3_exec(db,sql,NULL,NULL,&errmsg);//执行语句memset(sql,0,sizeof(sql)); sqlite3_close(db);//关闭数据库 person ++;getchar();printf("\033[0;34m提示:[q键+回车 退出][回车 继续输入]\033[0m\n");if((ch = getchar()) == 'q')//用if语句判断,跳出外层while循环,退回主函数 break;}}void display(STU *str[])//查看所有信息{ sqlite3 *db;char *errmsg; if(sqlite3_open("test.db",&db) != SQLITE_OK){ printf("open db error!\n"); exit(1);}sqlite3_exec(db,"select * from student",get_result,NULL,&errmsg); sqlite3_close(db);} void search(STU *str[])//形参也可以写作STU **str,搜索联系人{ int i;char name[NAME_LEN]; printf("please input the name of people you want to search:\n"); scanf("%s",name); for(i = 0; i < person; i++){ if(strcmp(str[i]->name,name) == 0) { printf("\033[0;32m搜索成功:\033[0m\n"); printf("联系人信息: name age sex\n"); printf(" -------------------------\n"); printf(" %s %d %c\n",str[i]->name,str[i]->age,str[i]->sex); printf(" -------------------------\n");return;}}printf("\033[0;31m搜索失败,不存在该联系人!\033[0m\n");} void delete(STU *str[])//删除联系人{ int i;int j; char name[NAME_LEN]; printf("please input the name of people you want to delete:\n"); scanf("%s",name); for(i = 0; i < person; i++){ if(strcmp(str[i]->name,name) == 0)//依次往前移 { printf("联系人信息: name age sex\n"); printf(" -------------------------\n"); printf(" %s %d %c\n",str[i]->name,str[i]->age,str[i]->sex); printf(" -------------------------\n"); free(str[i]); for(j = i; j < person - 1; j ++){ str[j] = str[j + 1];}str[person - 1] = NULL;person --;printf("\033[0;32m删除成功!\033[0m\n");return;}}printf("\033[0;31m删除失败!\033[0m\n");}int main(){ STU *stu[MAX_LEN] = {0};//结构体指针数组int choice;while(1){ menu(); printf("\n请输入0到5进行选择:\n");scanf("%d",&choice); printf("choice = %d\n",choice);switch(choice){ case ADD:{ system("clear"); add(stu); break;} case DISPLAY: { system("clear"); display(stu);printf("按任意键继续...\n");getchar();getchar(); break;} case SEARCH: { system("clear"); search(stu);printf("按任意键继续...\n");getchar();getchar(); break;} case DELETE:{ system("clear"); delete(stu);printf("按任意键继续...\n");getchar();getchar(); break; }case MODIFY:{ system("clear"); modify(stu); printf("按任意键继续...\n");getchar();getchar(); break;}case QUIT:{ exit(1); break;}}} return 0;}






