Day 46 转义字符大法好。

本文介绍如何利用C语言和SQLite数据库,通过解析文本文件中的单词及其解释,并将其批量插入到SQLite数据库中。文章详细展示了使用fgets()和strtok()函数进行字符串处理,以及如何构建SQL命令字符串并执行插入操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转义字符,在字符串拼接的时候可以妙用,尤其是对一些格式命令。
转义字符
//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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值