转义字符,在字符串拼接的时候可以妙用,尤其是对一些格式命令。
转义字符
//char *sql_cmd = “insert into user3 values(null,‘hhhh’,datetime(‘now’,’+8 hours’));”; sql 插入命令
sprintf(sql_cmd,“insert into user3 values(null,”%s", “%s”, datetime(‘now’,’+8 hours’));", name, explain);
此处使用转义字符可以将字符串替换后的字符里面的‘屏蔽掉。
windows下的换行为 \r\n
题目: 将一个进20000行的文件写入数据库中,每行会有单词和解释,需要用到字符串分割的方法,要注意,文本中每行的结尾为 \r\n
注意此分割条件。
使用fgets();函数来获取每行字符串。
然后使用strtok();函数来分割。
函数封装版
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>
#include <unistd.h>
void sql_opt(sqlite3 *db, char *name, char * explain)
{
char sql_cmd[2048] ={0};
sprintf(sql_cmd,"insert into user3 values(null,\"%s\", \"%s\", datetime('now','+8 hours'));", name, explain);
char *errmsg = NULL;
int ret = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);
if(SQLITE_OK !=ret)
{
fprintf(stderr, "exce sql[%s] err:%s\n", sql_cmd, errmsg);
sqlite3_free(errmsg);
exit(1);
}
}
void file_opt(FILE *fp, sqlite3 *db)
{
char buf[1024] ={0};
char *buf1[2] = {NULL};
while(1)
{
char * f = fgets(buf,1024,fp);
if(NULL == f)
{
break;
}
buf1[0] = strtok(buf, " ");
buf1[1] = strtok(NULL, "\r");
//此处通过取值判读可将,后半段字符串中的空格字符去掉。原理指针地址向后偏移。
while(' ' == *buf1[1])
{
++ buf1[1];
}
sql_opt(db, buf1[0],buf1[1]);
}
}
int main(void)
{
FILE * ret = fopen("/home/linux/work/9.04/sqlite_word/dict.txt","r");
if(NULL == ret)
{
perror("perror");
exit(1);
}
sqlite3 *db; //定义数据库指针
int rc= sqlite3_open("/home/linux/work/9.04/sqlite_word/user.db", &db);
if(rc)
{
fprintf(stderr,"open db:%s\n",sqlite3_errmsg(db));
return 1;
}
//操作函数,把文件写入数据库
file_opt(ret,db);
//关闭数据库
sqlite3_close(db);
//关闭文件
fclose(ret);
//此句可以判断程序是否执行完
printf("Hello World!\n");
return 0;
}
精简版
#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])
{
sqlite3 *db;
int ret = sqlite3_open("/home/linux/gaobian/20190904/test.dp",&db);
if(SQLITE_OK != ret)
{
fprintf(stderr,"open %s\n",sqlite3_errmsg(db));
}
FILE *fd = fopen("/home/linux/gaobian/20190904/dict.txt","r");
if(NULL == fd)
{
perror("open");
exit(1);
}
while(1)
{
char buf[1024] = {0};
char * ret = fgets(buf,1024,fd);
if(NULL == ret)
{
break;
}
//这部分写的很轻巧,酷。
char *p = strtok(buf," ");
char *q = strtok(NULL,"\r");
char sql_cmd[1024];
while(*q == ' ')
{
++q;
}
sprintf(sql_cmd,"insert into wordlist values (NULL,\"%s\",\"%s\");",p,q);
//这部分写的很轻巧,酷。
char *errmsg;
int ret1 = sqlite3_exec(db,sql_cmd,NULL,NULL,&errmsg);
if(SQLITE_OK != ret1)
{
fprintf(stderr,"exec [%s] err:%s\n",sql_cmd,errmsg);
sqlite3_free(errmsg);
}
}
sqlite3_close(db);
return 0;
}