标题:
在线电子词典项目C语言源码
[打印本页]
作者:
居高声自远
时间:
2018-8-26 23:55
标题:
在线电子词典项目C语言源码
逻辑清晰,框架规范的在线电子词典源程序
0.png
(45.2 KB, 下载次数: 49)
下载附件
2018-8-27 00:12 上传
C语言源程序如下:
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#define MAXLEN_DATA 256
int main ()
{
char buff[MAXLEN_DATA]={0};
FILE *fp;
int i= 0;
char word[35]="\0";
char *p;
char meaning[256];
char sql_cmd[128];
char *errmsg;
sqlite3 *db;
/*查找单词*/
if ((fp = fopen("dict.txt", "r")) == NULL)
{
perror("fail to open");
return -1;
}
if( sqlite3_open("wmk.db", &db) != SQLITE_OK)
{
printf("fail to open %s\n",sqlite3_errmsg(db));
}
while (fgets(buff, MAXLEN_DATA, fp) != NULL)
{
i= 0;
p= buff;
while (*p != ' ')
{
word[i] = *p;
i++;
p++;
continue;//跳过第一个单词
}
word[i] = '\0';
while (*(++p) == ' ')
{
continue;//跳过单词后面的空格
}
strcpy(meaning,p);
sprintf(sql_cmd,"insert into word values('%s','%s')",word,meaning);
if(sqlite3_exec(db, sql_cmd,NULL,NULL,&errmsg) != SQLITE_OK)
{
printf("fail exec\n");
}
}
if( sqlite3_close(db) != SQLITE_OK)
{
printf("fail to close %s\n",sqlite3_errmsg(db));
}
return 0;
}
复制代码
/*************************************************************************
> File Name: dict_server.c
> Author: WangMingkai
> Created Time: Sun 22 Apr 2018 06:40:59 PM CST
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<sqlite3.h>
#include<signal.h>
#include<time.h>
#include<pthread.h>
#include<time.h>
//定义用户数据结构体
struct message_user
{
char name[24];
char password[24];
char telephone[24];
char address[24];
char word[18];
char meaning[256];
char record[48][24];//存放查找结果内容的数组
char head[6][24]; //存放查找结果字段名称的数组
int state; //用户在线状态
int nrow; //数据库函数执行后得到记录的数目
int ncolumn;//数据库函数执行后得到字段的数目
int flag; //客户端发送的命令
int err; //判断执行数据库函数后是否成功
int binary; //判断查询历史记录的方式,0/姓名,1/单词
int update; //修改个人信息选项,0/密码,1/电话,2/地址
};
typedef struct message_user Mess_user;
char buffer1[256]={0};
int fd;
time_t timep;
//使用多线程来实现并发服务器
void *fun_pthread(void *arg)
{
int accept_sock_fd = *(int *)arg;
int addrlen;
Mess_user user;
char word[18] = {0};
char sql_cmd1[128] = {0};
char sql_cmd2[128] = {0};
time_t t;
int flag;
free(arg);
char buff[128];
char time_c[30];
int num = 1;
int i, j, index;
char **resultp;
int nrow, ncolumn;
sqlite3 *db;
char *errmsg;
//打开sqlite3数据库
if(sqlite3_open("wmk.db", &db) != 0)
{
perror("fail open sqlite3");
exit(-1);
}
while(1)
{
if(read(accept_sock_fd, &user, sizeof(struct message_user)) == -1)
{
perror("fail recv flag");
exit(-1);
}
switch(user.flag)
{
case 1:
//向数据库中插入用户名信息
read(accept_sock_fd, &user, sizeof(struct message_user));
sprintf(sql_cmd1,"select * from user where name='%s'",user.name);
if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
printf("fail exec %s\n",errmsg);
exit(-1);
}
if(nrow != 0)
{
user.err = 1;
write(accept_sock_fd, &user, sizeof(struct message_user));
break;
}
if(nrow == 0)
{
user.err = 0;
write(accept_sock_fd, &user, sizeof(struct message_user));
read(accept_sock_fd, &user, sizeof(struct message_user));
sprintf(sql_cmd2,"insert into user values ('%s','%s','%s','%s', %d)", user.name, user.password, user.telephone, user.address, user.state);
if(sqlite3_get_table(db, sql_cmd2, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
printf("fail exec %s\n",errmsg);
exit(-1);
}
user.err = 0;
write(accept_sock_fd, &user, sizeof(struct message_user));
time(&timep);//参数是能返回 time_t 型对象 的指针 timer ,那里存放着当时时间。
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s注册\n", time_c, user.name);
write(fd, buff, strlen(buff));
}
break;
//用户开始登录
case 2:
read(accept_sock_fd, &user, sizeof(struct message_user));
sprintf(sql_cmd1,"select * from user where name='%s'",user.name);
if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
printf("fail exec %s\n",errmsg);
exit(-1);
}
if( nrow == 0 )
{
user.err = 1;
write(accept_sock_fd, &user, sizeof(struct message_user));
break;
}
if( nrow == 1)
{
user.err = 0;
write(accept_sock_fd, &user, sizeof(struct message_user));
while(num != 0)
{
read(accept_sock_fd, &user, sizeof(struct message_user));
sprintf(sql_cmd2,"select password from user where name='%s'",user.name);
if(sqlite3_get_table(db, sql_cmd2, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
printf("fail exec %s\n",errmsg);
exit(-1);
}
num = strcmp(user.password, resultp[ncolumn]);
if(num == 0)
{
user.err = 0;//登录成功
sprintf(sql_cmd1, "update user set state=1 where name='%s'", user.name);
sqlite3_exec(db, sql_cmd1, NULL, NULL,&errmsg);
time(&timep);
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s登录\n", time_c, user.name);
write(fd, buff, strlen(buff));
}
if(num != 0)
{
user.err = 1;//登录失败
}
write(accept_sock_fd, &user, sizeof(struct message_user));
}
}
break;
case 3:
//开始查找单词含义,在数据库中插入查找时间戳记录,并把查找结果发送给客户端
if(read(accept_sock_fd, &user, sizeof(struct message_user)) == -1)
{
perror("fail recv word");
exit(-1);
}
sprintf(sql_cmd1,"select meaning from word where word='%s'",user.word);
if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
printf("fail exec %s\n",errmsg);
exit(-1);
}
if(nrow == 0)
{
user.err = 1;
write(accept_sock_fd, &user,sizeof(struct message_user));
break;
}
if(nrow != 0)
{
strcpy(user.meaning, resultp[ncolumn]);
user.err = 0;
write(accept_sock_fd, &user,sizeof(struct message_user));
sprintf(sql_cmd1, "insert into record values ('%s','%s')", user.name, user.word);
if(sqlite3_exec(db,sql_cmd1, NULL, NULL, &errmsg) != 0)
{
printf("fail ecec %s\n",errmsg);
exit(-1);
}
time(&timep);
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s查找单词%s\n", time_c, user.name, user.word);
write(fd, buff, strlen(buff));
break;
}
case 4:
//查找历史记录
read(accept_sock_fd, &user, sizeof(struct message_user));
if(user.binary == 0)
{
sprintf(sql_cmd1,"select word from record where name='%s'",user.name);
}
if(user.binary == 1)
{
sprintf(sql_cmd1,"select name from record where word='%s'",user.word);
}
if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
printf("fail exec %s\n",errmsg);
exit(-1);
}
if( nrow == 0 )
{
user.err = 1;
write(accept_sock_fd, &user, sizeof(struct message_user));
break;
}
if( nrow != 0)
{
user.err = 0;
j = ncolumn;
for(i = 0; i < nrow; i++)
{
strcpy(user.record[i], resultp[j++]);
}
user.nrow = nrow;
write(accept_sock_fd, &user, sizeof(struct message_user));
time(&timep);
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s查看历史记录\n", time_c, user.name);
write(fd, buff, strlen(buff));
}
break;
case 5:
//查看个人信息
read(accept_sock_fd, &user, sizeof(struct message_user));
sprintf(sql_cmd1, "select * from user where name='%s'", user.name);
sqlite3_exec(db, ".header on", NULL, NULL, &errmsg);
sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg);
sqlite3_exec(db, ".header off", NULL, NULL, &errmsg);
if( nrow == 0 )
{
user.err = 1;
write(accept_sock_fd, &user, sizeof(struct message_user));
break;
}
if( nrow != 0)
{
user.err = 0;
index = ncolumn;
for(i = 0; i < nrow; i++)
{
for(j = 0; j < ncolumn; j++)
{
strcpy(user.record[j], resultp[index++]);
strcpy(user.head[j], resultp[j]);
}
}
user.nrow = nrow;
user.ncolumn = ncolumn;
write(accept_sock_fd, &user, sizeof(struct message_user));
time(&timep);
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s查看个人信息\n", time_c, user.name);
write(fd, buff, strlen(buff));
}
break;
case 6:
//修改个人信息
read(accept_sock_fd, &user, sizeof(struct message_user));
if(user.update == 0)
{
sprintf(sql_cmd1,"select password from user where name='%s'",user.name);
sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg);
num = strcmp(user.password, resultp[ncolumn]);
if(num != 0)
{
user.nrow = 0;
write(accept_sock_fd, &user, sizeof(struct message_user));
break;
}
if(num == 0)
{
user.nrow = 1;
write(accept_sock_fd, &user, sizeof(struct message_user));
read(accept_sock_fd, &user, sizeof(struct message_user));
sprintf(sql_cmd2,"update user set password='%s' where name='%s'", user.password, user.name);
if(sqlite3_get_table(db, sql_cmd2, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
user.err = 1;
}
else
user.err = 0;
write(accept_sock_fd, &user, sizeof(struct message_user));
time(&timep);
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s修改个人密码为%s\n", time_c, user.name, user.password);
write(fd, buff, strlen(buff));
break;
}
}
if(user.update == 1)
{
sprintf(sql_cmd1,"update user set telephone='%s' where name='%s'", user.telephone, user.name);
if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
user.err = 1;
}
else
user.err = 0;
write(accept_sock_fd, &user, sizeof(struct message_user));
time(&timep);
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s修改个人电话为%s\n", time_c, user.name, user.telephone);
write(fd, buff, strlen(buff));
break;
}
if(user.update == 2)
{
sprintf(sql_cmd1,"update user set address='%s' where name='%s'", user.address, user.name);
if(sqlite3_get_table(db, sql_cmd1, &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
user.err = 1;
}
else
user.err = 0;
write(accept_sock_fd, &user, sizeof(struct message_user));
time(&timep);
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s修改个人地址为%s\n", time_c, user.name, user.address);
write(fd, buff, strlen(buff));
break;
}
case 0:
//关闭数据
read(accept_sock_fd, &user, sizeof(struct message_user));
sprintf(sql_cmd1, "update user set state=0 where name='%s'", user.name);
sqlite3_exec(db, sql_cmd1, NULL, NULL,&errmsg);
time(&timep);
strcpy(time_c, ctime(&timep));
sprintf(buff, "%s用户%s退出\n", time_c, user.name);
write(fd, buff, strlen(buff));
break;
}
if(user.flag == 0)
break;
}
sqlite3_close(db);
pthread_exit(NULL);
}
//管理员模式显示所有用户
void fun_admin_show(sqlite3 *db)
{
char *errmsg, **resultp;
int nrow, ncolumn, i, j, index;
if(sqlite3_get_table(db, "select * from user", &resultp, &nrow, &ncolumn, &errmsg) != 0)
{
printf("fail admin show : %s\n",errmsg);
return;
}
index = ncolumn;
for(i = 0; i < nrow; i++)
{
for(j = 0; j < ncolumn; j++)
{
printf("%s:%s\n", resultp[j], resultp[index++]);
}
printf("-------------------------------------\n");
}
}
//管理员模式修改用户信息
void fun_admin_alter(sqlite3 *db)
{
char name[24];
char telephone[24];
char address[24];
int alter_cmd;
char sql[128];
char *errmsg, **resultp;
int nrow, ncolumn, i, j, index;
while(1)
{
printf("请输入您要修改的用户名:");
scanf("%s",name);
sprintf(sql, "select * from user where name='%s'",name);
sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg);
if(nrow == 0)
{
printf("没有此用户,请更换用户名\n");
}
if(nrow != 0)
{
while(1)
{
printf("请输入您要修改的属性(0/电话,1/地址):");
scanf("%d",&alter_cmd);
if(alter_cmd > 1 || alter_cmd < 0)
{
printf("输入错误,请重新输入\n");
}
else
{
if(alter_cmd == 0)
{
printf("请输入需要更改的新电话号码:");
scanf("%s",telephone);
sprintf(sql, "update user set telephone='%s' where name='%s'", telephone, name);
if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg) == 0)
{
printf("更改成功!\n");
break;
}
}
if(alter_cmd == 1)
{
printf("请输入需要更改的新地址:");
scanf("%s",address);
sprintf(sql, "update user set address='%s' where name='%s'", address, name);
if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg) == 0)
{
printf("更改成功!\n");
break;
}
}
}
}
break;
}
}
}
//管理员模式添加用户
void fun_admin_add(sqlite3 *db)
{
char name[24];
char password[24];
char telephone[24];
char address[24];
int state;
char sql[128];
char *errmsg, **resultp;
int nrow, ncolumn, i, j, index;
while(1)
{
printf("请输入您要添加的用户名:");
scanf("%s",name);
sprintf(sql, "select * from user where name='%s'",name);
sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg);
if(nrow == 1)
{
printf("该用户已存在,请更换用户名\n");
}
if(nrow == 0)
{
printf("请输入您的密码:");
scanf("%s",password);
printf("请输入您的电话:");
scanf("%s",telephone);
printf("请输入您的地址:");
scanf("%s",address);
state = 0;
sprintf(sql, "insert into user values ('%s', '%s', '%s', '%s', %d)", name, password, telephone, address, state);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) == 0)
{
printf("添加成功!");
break;
}
else
{
printf("添加失败\n");
}
}
}
}
//管理员删除用户
void fun_admin_delete(sqlite3 *db)
{
char name[24];
char sql[128];
char *errmsg, **resultp;
int nrow, ncolumn;
while(1)
{
printf("请输入您要删除的用户名:");
scanf("%s", name);
sprintf(sql, "select * from user where name='%s'",name);
sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg);
if(nrow == 0)
{
printf("该用户不存在,请更换用户名\n");
}
if(nrow != 0)
{
sprintf(sql, "delete from user where name='%s'",name);
if(sqlite3_get_table(db, sql, &resultp, &nrow, &ncolumn, &errmsg) == 0)
{
printf("删除用户成功\n");
break;
}
}
}
}
//服务器的管理员模式
void *fun_admin_pthread()
{
int f_cmd;
char name[24];
char telephone[24];
char address[24];
char admin;
sqlite3 *db;
if(sqlite3_open("wmk.db", &db) != 0)
{
perror("fail open sqlite3");
exit(-1);
}
while(1)
{
printf("请按A进入管理员模式\n");
scanf("%c",&admin);
if(admin == 'A')
{
system("clear");
printf("*********************************\n");
printf("管理员模式开启\n");
printf("*********************************\n");
printf("1:显示所有用户信息\n");
printf("2:修改用户信息\n");
printf("3:添加用户\n");
printf("4:删除用户\n");
printf("0:退出\n");
printf("*********************************\n");
while(f_cmd)
{
printf("请输入您要进行的操作:");
scanf("%d",&f_cmd);
if(f_cmd < 0 || f_cmd > 4)
{
printf("输入有误,请重新输入\n");
}
switch(f_cmd)
{
case 1:
fun_admin_show(db);
break;
case 2:
fun_admin_alter(db);
break;
case 3:
fun_admin_add(db);
break;
case 4:
fun_admin_delete(db);
break;
case 0:
break;
}
if(f_cmd == 0)
{
break;
}
printf("请按回车键继续:");
getchar();
while(getchar() != '\n')
{
;
}
system("clear");
printf("*********************************\n");
printf("管理员模式开启\n");
printf("*********************************\n");
printf("1:显示所有用户信息\n");
printf("2:修改用户信息\n");
printf("3:添加用户\n");
printf("4:删除用户\n");
printf("0:退出\n");
printf("*********************************\n");
}
}
}
}
int main(int argc, char *argv[])
{
Mess_user user;
int sock_fd, accept_sock_fd, addrlen;
pthread_t pid, f_pid;
int *fun_sockfd = NULL;
char word[18] = {0};
char sql_cmd[128] = {0};
int flag;
sqlite3 *db;
char *errmsg;
fd = open("log.txt", O_RDWR|O_CREAT|O_APPEND, 0666);
struct sockaddr_in server_addr, client_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(2342);
server_addr.sin_addr.s_addr = inet_addr("192.168.1.165");
//创建套接字
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if(sock_fd == -1)
{
perror("fail socket");
exit(-1);
}
//绑定套接字
if(bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
{
perror("fail bind");
exit(-1);
}
//监听套接字
if(listen(sock_fd, 4) == -1)
{
perror("fail listen");
exit(-1);
}
//管理员模式
pthread_create(&f_pid, NULL, fun_admin_pthread, NULL);
//使用并发服务器,可保证多客户端使用
while(1)
{
memset(&user, 0, sizeof(struct message_user));
addrlen = sizeof(client_addr);
accept_sock_fd = accept(sock_fd, (struct sockaddr *)&client_addr,(socklen_t *)&addrlen);
if(accept_sock_fd == -1)
{
perror("fail accept");
exit(-1);
}
fun_sockfd = (int *)malloc(sizeof(int));
*fun_sockfd= accept_sock_fd;
pthread_create(&pid, NULL, fun_pthread, (void*)fun_sockfd);
}
return 0;
}
复制代码
所有资料51hei提供下载:
在线词典.rar
(975.63 KB, 下载次数: 17)
2018-8-26 23:54 上传
点击文件名下载附件
在线电子词典源码
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1