tongxunlu.h
#ifndef _TONGXUNLU_H_
#define _TONGXUNLU_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
void welcome(); //欢迎界面
void menu(); //菜单界面
int create_table(sqlite3 *pdb); //创建表
int insert_record(sqlite3 *pdb); //插入数据
int insert_record(sqlite3 *pdb); //插入数据
void is_tel_right(char *tel); //检查号码格式是否有误
int lookinfo(sqlite3 *pdb); //查看通讯录
void findinfo(sqlite3 *pdb); //查找联系人
int findinfo_id(sqlite3 *pdb); //按id查找联系人
int findinfo_name(sqlite3 *pdb); //按姓名查找联系人
int deleteinfo(sqlite3 *pdb); //删除联系人
int changeinfo(sqlite3 *pdb); //修改联系人信息
void display(char **pResult, int rowc, int colc); //打印结果
void mypause(); //暂停
#endif
tongxunlu.c
#include "tongxunlu.h"
void welcome() //欢迎界面
{
system("clear");
printf("-----------------------------------------------------\n");
printf("\t\t欢迎使用BK通讯录系统\n");
printf("\t\t正在加载......\n");
printf("-----------------------------------------------------\n");
}
void menu() //菜单界面
{
sleep(1);
system("clear");
printf("********************************\n");
printf("\t1.***添加用户***\n");
printf("\t2.***查看用户***\n");
printf("\t3.***搜索用户***\n");
printf("\t4.***删除用户***\n");
printf("\t5.***修改用户***\n");
printf("\t6.***退出系统***\n");
printf("********************************\n");
}
int create_table(sqlite3 *pdb) //创建表
{
char *sql = NULL;
char *errmsg = NULL;
sql = "create table if not exists person (id integer primary key not null, name text not null unique, age integer not null, tel text not null, address text not null);";
if (SQLITE_OK != sqlite3_exec(pdb, sql, NULL, NULL, &errmsg))
{
printf("Create table fail: %s\n", errmsg);
sleep(1);
return -1;
}
return SQLITE_OK;
}
int insert_record(sqlite3 *pdb) //插入数据
{
system("clear");
char sql[100];
char *errmsg = NULL;
int id, age;
char name[20];
char tel[20];
char address[20];
printf("Please input (id name age tel address):\n");
scanf("%d %s %d %s %s", &id, name, &age, tel, address);
is_tel_right(tel);
sprintf(sql, "insert into person values (%d, '%s', %d, '%s', '%s');", id, name, age, tel, address);
if (SQLITE_OK != sqlite3_exec(pdb, sql, NULL, NULL, &errmsg))
{
printf("insert record fail: %s\n", errmsg);
sleep(1);
return -1;
}
system("clear");
printf("插入成功!\n");
printf("返回主菜单中...\n");
return SQLITE_OK;
}
void is_tel_right(char *tel) //检查号码格式是否有误
{
int mark = 0; //创建一个标记,如果号码有误,mark标记为1,然后重新输入
char *p = tel;
if (11 != strlen(tel)) // 手机号码必须为11位
{
mark = 1;
}
while (*p != '\0') //挨个遍历查询输入的是否正确
{
if (*p < '0' || *p > '9')
{
mark = 1;
}
p++;
}
if (1 == mark)
{
printf("联系人手机号码输入格式有误!请重新输入号码!\n");
scanf("%s", tel);
is_tel_right(tel); //递归调用直到输入无误为止
}
//输入无误mark为0不需要处理
}
void display(char **pResult, int rowc, int colc) //打印结果
{
int i;
for (i = 0; i < (rowc + 1) * colc; i++)
{
printf("%-15s", pResult[i]);
if (((i + 1) % colc) == 0)
{
putchar(10);
}
}
}
void mypause() //暂停
{
char mark;
printf("按任意键输入回车后返回主菜单\n");
scanf(" %c", &mark);
system("clear");
printf("返回主菜单中...\n");
}
int lookinfo(sqlite3 *pdb) //查看通讯录
{
system("clear");
char *sql = NULL;
char *errmsg = NULL;
char **pResult = NULL;
int rowc, colc;
int flag = 0;
sql = "select * from person;";
if (SQLITE_OK != sqlite3_get_table(pdb, sql, &pResult, &rowc, &colc, &errmsg))
{
printf("lookinfo fail: %s\n", errmsg);
sqlite3_free_table(pResult);
sleep(1);
return -1;
}
else
{
display(pResult, rowc, colc);
sqlite3_free_table(pResult);
mypause();
return SQLITE_OK;
}
}
void findinfo(sqlite3 *pdb) //查找联系人
{
system("clear");
int choice;
while (1)
{
printf("按1输入id进行查找!\n");
printf("按2输入姓名进行查找!\n");
scanf("%d", &choice);
switch(choice)
{
case 1:
if (SQLITE_OK != findinfo_id(pdb))
{
printf("返回主菜单中...\n");
}
return;
case 2:
if (SQLITE_OK != findinfo_name(pdb))
{
printf("返回主菜单中...\n");
}
return;
default:
printf("输入有误!请重新输入!\n");
printf("返回上一级菜单中...\n");
sleep(1);
system("clear");
continue;
}
}
}
int findinfo_id(sqlite3 *pdb) //按id查找联系人
{
system("clear");
char sql[100];
char *errmsg;
char **pResult;
int rowc, colc, id;
printf("Please input id you want to find:\n");
scanf("%d", &id);
sprintf(sql, "select * from person where id = %d;", id);
if (SQLITE_OK != sqlite3_get_table(pdb, sql, &pResult, &rowc, &colc, &errmsg))
{
system("clear");
printf("findinfo_id fail: %s\n", errmsg);
sqlite3_free_table(pResult);
sleep(1);
return -1;
}
else
{
if (0 == rowc)
{
system("clear");
printf("查无此人!\n");
printf("返回主菜单中...\n");
sleep(1);
}
else
{
system("clear");
display(pResult, rowc, colc); //打印结果
mypause();
}
sqlite3_free_table(pResult);
return SQLITE_OK;
}
}
int findinfo_name(sqlite3 *pdb) //按姓名查找联系人
{
system("clear");
char sql[100];
char name[20];
char *errmsg;
char **pResult;
int rowc, colc;
printf("Please input name you want to find:\n");
scanf("%s", name);
sprintf(sql, "select * from person where name = '%s';", name);
if (SQLITE_OK != sqlite3_get_table(pdb, sql, &pResult, &rowc, &colc, &errmsg))
{
system("clear");
printf("findinfo_id fail: %s\n", errmsg);
sqlite3_free_table(pResult);
sleep(1);
return -1;
}
else
{
if (0 == rowc)
{
system("clear");
printf("查无此人!\n");
printf("返回主菜单中...\n");
sleep(1);
}
else
{
system("clear");
display(pResult, rowc, colc); //打印结果
mypause();
}
sqlite3_free_table(pResult);
return SQLITE_OK;
}
}
int deleteinfo(sqlite3 *pdb) //删除联系人
{
system("clear");
char sql[100];
char name[20];
char *errmsg;
int rowc, colc;
printf("Please input name you want to delete:\n");
scanf("%s", name);
sprintf(sql, "delete from person where name = '%s';", name);
if (SQLITE_OK != sqlite3_exec(pdb, sql, NULL, NULL, &errmsg))
{
printf("Delete info fail: %s\n", errmsg);
sleep(1);
return -1;
}
else
{
system("clear");
printf("联系人%s已删除!\n", name);
printf("返回主菜单中...\n");
return SQLITE_OK;
}
}
int changeinfo(sqlite3 *pdb) //修改联系人信息
{
system("clear");
char sql[100];
char name[20];
int id, age;
char tel[20];
char address[20];
char *errmsg;
printf("Please input name you want to change:\n");
scanf("%s", name);
printf("Please input (id age tel address):\n");
scanf("%d %d %s %s", &id, &age, tel, address);
is_tel_right(tel);
sprintf(sql, "update person set id = %d, age = %d, tel = '%s', address = '%s' where name = '%s';", id, age, tel, address, name);
if (SQLITE_OK != sqlite3_exec(pdb, sql, NULL, NULL, &errmsg))
{
printf("Change info fail: %s\n", errmsg);
sleep(1);
return -1;
}
else
{
system("clear");
printf("联系人%s已修改!\n", name);
printf("返回主菜单中...\n");
return SQLITE_OK;
}
}
main.c
#include "tongxunlu.h"
int main()
{
sqlite3 *pdb = NULL;
if (SQLITE_OK != sqlite3_open("database_txl.db", &pdb)) //创建(打开)数据库
{
printf("Open database fail: %s\n", sqlite3_errmsg(pdb));
exit (-1);
}
printf("Open database success!\n");
if (SQLITE_OK != create_table(pdb)) //创建表
{
sqlite3_close(pdb);
exit(-1);
}
welcome();
int chioce;
while(1)
{
menu();
scanf("%d", &chioce);
switch(chioce)
{
case 1:
if (SQLITE_OK != insert_record(pdb)) //插入数据
{
printf("有错误,返回主菜单中...\n");
sleep(1);
continue;
}
break;
case 2:
if (SQLITE_OK != lookinfo(pdb)) //查看通讯录
{
printf("有错误,返回主菜单中...\n");
sleep(1);
continue;
}
break;
case 3:
findinfo(pdb); //查找联系人
break;
case 4:
if (SQLITE_OK != deleteinfo(pdb)) //删除联系人
{
printf("有错误,返回主菜单中...\n");
sleep(1);
continue;
}
break;
case 5:
if (SQLITE_OK != changeinfo(pdb)) //修改联系人信息
{
printf("有错误,返回主菜单中...\n");
sleep(1);
continue;
}
break;
case 6:
system("clear");
sqlite3_close(pdb); //关闭数据库
printf("close database success!\n");
printf("正在退出......期待您的下次使用!\n");
sleep(1);
system("clear");
exit(0);
default:
system("clear");
printf("输入有误,请重新输入!\n");
sleep(1);
continue;
}
}
}
makefile
OBJS=main.o tongxunlu.o
txl:$(OBJS)
gcc $(OBJS) -o txl -lsqlite3
tongxunlu.o:$<
gcc -c tongxunlu.c
main.o:main.c
gcc -c main.c
.PHONY:clean
clean:
rm *.o txl