在Linux下,用SQlite数据库编写的图书管理系统源代码及错误总结

来源:互联网 发布:能以礼让为国乎何有 编辑:程序博客网 时间:2024/05/18 00:12
</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 TecnologyFile name:db.cAuthor: Xiecan  Version:0.1    Date: 2016-05-10 14:48Description:Funcion List: *****************************************************/#include <stdlib.h>#include <stdio.h>#include <sqlite3.h>#define N 10#define M 15int 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;}

1 0
原创粉丝点击