</pre><pre name="code" class="html">
总结:重点是利用sprintf()函数实现数据动态输入输出
错误总结:刚开始输入数据时只能输入一个字符,多于一个字符就出现段错误,检查后发现是<pre name="code" class="html">sprintf(sql,"insert into book_info(ISBN,name,writer,publisher,time,price) values(%d,'%s','%s','%s','%s',%d);",ISBN,name,writer,publisher,time,price);
printf("---------------------\n");这一句中,<span style="font-family: Arial, Helvetica, sans-serif;">values()里面有字符串,应该用单引号括起来,才表示将一个字符串插入相应的地方,否则就只能输入一个字符。</span>
<span style="font-family:Arial, Helvetica, sans-serif;">在Linux下编写程序时,遇到最多的错误就是段错误, 通常段错误是指访问的内存超出了系统所给这个程序的内存空间,遇到段错误,首先检查scanf(),看输入的参数有没有加取地址符,很多时候我都是这个地方出问题了;</span>
<span style="font-family:Arial, Helvetica, sans-serif;">再检查指针。。。。</span>
<span style="font-family:Arial, Helvetica, sans-serif;">个人心得:本来觉得应该很难写,自己写不出来的,后来因为某个赌注,逼着自己一晚上写了出来,这个程序也算是我写程序的又一个新的起点吧,以后会更加自信!!</span>
/*****************************************************
copyright (C), Nanjing University of Tecnology
File name:db.c
Author: Xiecan Version:0.1 Date: 2016-05-10 14:48
Description:
Funcion List:
*****************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <sqlite3.h>
#define N 10
#define M 15
int displaycb(void *para,int n_column,char ** column_value,char ** column_name);
int inquire_usecb(sqlite3 *db);
void Menus(sqlite3 *db);
int creat_table(sqlite3 *db);
int insert_data(sqlite3 *db);
int delete_data(sqlite3 *db);
int update_data(sqlite3 *db);
int find_data(sqlite3 *db);
int show_data(sqlite3 *db);
int qiut(sqlite3 *db);
int main(int argc, char **argv)
{
sqlite3 *db = NULL;
int rc;
rc = sqlite3_open("database.db",&db);
if(rc != SQLITE_OK)
{
printf("open database error!\n");
exit(-1);
}
else
{
printf("create database success!\n");
}
rc = creat_table(db);
while(1)
{
Menus(db);
}
//rc = creat_table(db);
return 0;
}
int inquire_usecb(sqlite3 *db)
{
char *sql;
char *errmsg;
sql = "select * from book_info;";
if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
{
printf("exec_select error!error on:%s\n",errmsg);
exit(-1);
}
/*sql = "./header on";
if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
{
printf("exec_header error!error on:%s\n",errmsg);
exit(-1);
}*/
return 0;
}
int displaycb(void *para,int n_column,char **column_value,char ** column_name)
{
int i;
printf("**************************************************\n");
printf("total column is %d\n",n_column);
for(i = 0; i < n_column; i++)
{
printf("columnname:%s---->columnvalue:%s\n",column_name[i],column_value[i]);
}
printf("**************************************************\n");
return 0;
}
/****************************************************
函数功能:选择菜单
****************************************************/
void Menus(sqlite3 *db)
{
int ch;
printf("/***************欢迎进入图书管理系统****************/\n");
printf("* 1.添加图书信息\
\n 2.删除图书信息\
\n 3.查找图书信息\
\n 4.修改图书信息\
\n 5.输出图书管理系统所有图书信息\
\n 6.退出系统\
\n/***************************************************/\n");
printf("请输入你想进行的操作:\n");
scanf("%d",&ch);
switch(ch)
{
case 1:
insert_data(db);
inquire_usecb(db);
break;
case 2:
delete_data(db);
inquire_usecb(db);
break;
case 3:
find_data(db);
inquire_usecb(db);
break;
case 4:
update_data(db);
inquire_usecb(db);
break;
case 5:
inquire_usecb(db);
break;
case 6:
qiut(db);
break;
default:
printf("输入错误,请重新输入!\n");
}
}
int creat_table(sqlite3 *db)
{
char *sql;
char *errmsg;
sql = "create table if not exists book_info(\
ISBN integer primary key,\
name text,\
writer text,\
publisher text,\
time text,\
price real);";
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_create table error! error on:%s\n",errmsg);
exit(-1);
}
return 0;
}
int insert_data(sqlite3 *db)
{
char sql[100];
char *errmsg;
int i;
int num;
int ISBN;
char name[N];
char writer[N];
char publisher[N];
char time[N];
int price;
printf("你想录入几本书?\n");
scanf("%d",&num);
for(i = 1; i <= num; i++)
{
printf("请输入第%d本书的信息:\n",i);
printf("ISBN:");
scanf("%d",&ISBN);
printf("书名:");
//gets(name);
scanf("%s",name);
printf("作者:");
scanf("%s",writer);
printf("出版社:");
scanf("%s",publisher);
printf("出版时间:");
scanf("%s",time);
printf("价格:");
scanf("%d",&price);
printf("********************\n");
sprintf(sql,"insert into book_info(ISBN,name,writer,publisher,time,price) values(%d,'%s','%s','%s','%s',%d);",ISBN,name,writer,publisher,time,price);
printf("---------------------\n");
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_insert data error! error on:%s\n",errmsg);
exit(-1);
}
}
return 0;
}
/*****************************************************
函数功能:删除图书
*****************************************************/
int delete_data(sqlite3 *db)
{
char sql[100];
char *errmsg;
int ch;
int ISBN;
char name[N];
char writer[N];
char publisher[N];
char time[N];
printf("--------删除图书信息--------\n");
printf("请选择你想进行的删除操作:\n");
printf(" 1.删除与指定ISBN相同的书\
\n 2.删除与指定书名相同的书\
\n 3.删除指定作者的书\
\n 4.删除指定出版社的书\n");
printf("------------------------\n");
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("请输入你要删除的图书的ISBN:\n");//根据ISBN找到指定图书
scanf("%d",&ISBN);
sprintf(sql,"delete from book_info where ISBN = %d;",ISBN);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_delete data according to ISBN error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 2:
printf("请输入你想删除图书的名字:\n");
scanf("%s",name);
sprintf(sql,"delete from book_info where name = %s;",name);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_delete data according to name error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 3:
printf("请输入你想删除图书的作者名:\n");
scanf("%s",writer);
sprintf(sql,"delete from book_info where writer = %s;",writer);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_delete data according to writer error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 4:
printf("请输入你想删除图书的出版社名字:\n");
scanf("%s",publisher);
sprintf(sql,"delete from book_info where publisher = %s;",publisher);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_delete data according to publisher error! error on:%s\n",errmsg);
exit(-1);
}
break;
default:
printf("输入错误!\n");
}
}
/******************************************************
函数功能:根据需要选择要进行修改的操作
******************************************************/
int update_data(sqlite3 *db)
{
char *errmsg;
char sql[100];
int ch;
int c = 1;
int NU;
int ISBN;
char name[N];
char writer[N];
char publisher[N];
char time[N];
int price;
while(c)
{
c = 0;
printf("--------修改图书信息--------\n");
printf("请输入你想修改图书的ISBN:\n");
scanf("%d",&NU);
printf("请选择你想进行的修改操作:\n");
printf(" 1.修改ISBN\
\n 2.修改书名\
\n 3.修改作者\
\n 4.修改出版社名\
\n 5.修改书的价格\
\n 6.修改出版日期\n");
printf("----------------------\n");
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("请输入新的ISBN:\n");
scanf("%d",&ISBN);
sprintf(sql,"update book_info set ISBN = %d where ISBN = %d;",ISBN,NU);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_update ISBN error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 2:
printf("请输入新的书名:\n");
scanf("%s",name);
sprintf(sql,"update book_info set name = %s where ISBN = %d;",name,NU);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_update name error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 3:
printf("请输入新的作者名字:\n");
scanf("%s",writer);
sprintf(sql,"update book_info set writer = %s where ISBN = %d;",writer,NU);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_update writer error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 4:
printf("请输入新的出版社名字:\n");
scanf("%s",publisher);
sprintf(sql,"update book_info set publisher = %s where ISBN = %d;",publisher,NU);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_update publisher error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 5:
printf("请输入新的time:\n");
scanf("%s",time);
sprintf(sql,"update book_info set time = %s where ISBN = %d;",time,NU);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_update time error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 6:
printf("请输入新的price:\n");
scanf("%d",&price);
sprintf(sql,"update book_info set price = %d where ISBN = %d;",price,NU);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_update price error! error on:%s\n",errmsg);
exit(-1);
}
break;
default:
printf("输入错误\n");
}
C: printf("还要继续修改吗?\
\n1.继续\
\n0.退出\n");
scanf("%d",&c);
if(c > 1)
{
printf("输入错误,请重新输入!\n");
goto C;
}
}
printf("修改后:\n");
}
int find_data(sqlite3 *db)
{
char sql[100];
char *errmsg;
int ch;
int a,b;
char stime[N];
char etime[N];
int ISBN;
char name[N];
char writer[N];
char publisher[N];
printf("--------查找图书信息--------\n");
printf("请选择你想进行的查找操作:\n");
printf(" 1.按ISBN查找\
\n 2.按书名查找\
\n 3.查找指定作者的所有书\
\n 4.查找指定出版社出版的所有书\
\n 5.查找书的价格范围在指定区间的书\
\n 6.查找出版时间在指定区间内的书\n");
printf("----------------------\n");
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("请输入你想查找图书的ISBN:\n");
scanf("%d",&ISBN);
sprintf(sql,"select * from book_info where ISBN = %d;",ISBN);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_find data according to ISBN error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 2:
printf("请输入你想查找图书的书名:\n");
scanf("%s",name);
sprintf(sql,"select * from book_info where = %s;",name);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_find data according to name error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 3:
printf("请输入你想查找图书的作者:\n");
scanf("%s",writer);
sprintf(sql,"select * from book_info where writer = %s;",writer);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_find data according to writer error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 4:
printf("请输入你想查找图书的出版社名字:\n");
scanf("%s",publisher);
sprintf(sql,"select * from book_info where publisher = %s;",publisher);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_find data according to publisher error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 5:
printf("请输入你想查找图书价格的下限:\n");
scanf("%s",&a);
printf("请输入你想查找图书的上限:\n");
scanf("%s",&b);
sprintf(sql,"select * from book_info where price in (%d,%d);",a,b);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_find data according to price error! error on:%s\n",errmsg);
exit(-1);
}
break;
case 6:
printf("请输入你想查找图书出版日期的区间[a,b]:(以逗号隔开)\n");
scanf("%s,%s",stime,etime);
sprintf(sql,"select * from book_info where strcmp(time,%s) >= 0 and strcmp(time,%s) <= 0;",stime,etime);
if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
{
printf("exec_find data according to time error! error on:%s\n",errmsg);
exit(-1);
}
break;
default:
printf("输入错误\n");
}
return 0;
}
int show_data(sqlite3 *db)
{
return 0;
}
int qiut(sqlite3 *db)
{
printf("欢迎使用图书管理系统,再见!\n");
sqlite3_close(db);
exit(0);
return 0;
}