MySQL数据库⑪_C/C++连接MySQL_发送请求
目录
1. 下载库文件
2. 使用库
3. 链接MySQL函数
4. C/C++链接示例
5. 发送SQL请求
6. 获取查询结果
本篇完。
1. 下载库文件
要使用C/C++连接MySQL,需要使用MySQL官网提供的库。
进入MySQL官网选择适合自己平台的mysql connect库,然后点击下载就行了。
比如此链接MySQL :: Download Connector/C++
下载完毕后需要将其上传到云服务器,这里将下载的库文件存放在下面的目录:
使用rz -E命令将刚才下载的库文件上传到云服务器。
然后使用tar命令将压缩包解压到当前目录下。
进入解压后的目录当中,可以看到有一个include子目录和一个lib子目录。
其中,include目录下存放的一堆头文件。而lib目录下存放的就是动静态库。
2. 使用库
为了方便在项目中使用刚才的库文件,可以在项目目录下创建两个软连接,分别连接到刚才的include目录和lib目录。
这时直接在项目目录下,就能看到刚才include和lib目录下的内容。
下面先通过调用mysql_get_client_info来判断库是否引入成功,该函数的作用就是获取客户端的版本信息。
#include <iostream>
#include <mysql.h>
using namespace std;int main()
{//获取客户端的版本信息cout<<"mysql client version: "<<mysql_get_client_info()<<endl;return 0;
}
为了方便后续重复编译源文件,可以在项目目录下创建一个Makefile,Makefile当中的内容如下:
- -I(大写i):用于指明头文件的搜索路径。
- -L:用于指明库文件的搜索路径。
- -l(小写L):用于指明需要连接库文件路径下的哪一个库。
Makefile编写完毕后,直接通过make命令即可编译代码生成可执行程序。
但此时生成的可执行程序还不能直接运行,通过ldd命令可以看到,该可执行程序所依赖的mysqlclient库找不到。如下:
- gcc/g++编译器默认都是动态链接的,编译代码时默认使用的是动态库,所以生成的可执行程序在运行时需要找到对应的动态库进行链接,而我们使用的mysqlclient库并不在系统的搜索路径下。
- 需要注意的是,Makefile中的-I,-L和-l这三个选项,只是在编译期间告诉编译器头文件和库文件在哪里,而可执行程序生成后就与编译器无关了。
解决该问题通常有三种做法:
- 将库文件拷贝到系统默认的库文件搜索路径下/lib64。
- 将库文件所在的目录路径添加到LD_LIBRARY_PATH环境变量中,该环境变量可以用于指定查找动态库时的其他路径。
- 将库文件所在的目录路径保存到以.conf为后缀的配置文件中,然后将该文件拷贝到/etc/ld.so.conf.d/目录下,并使用ldconfig命令对配置文件进行更新,该目录下所有配置文件中的路径也将作为查找动态库时的搜索路径。
这里采用第三种方式进行解决。如下:
此时该可执行程序所依赖的mysqlclient库就能够被找到了。如下:
3. 链接MySQL函数
在连接数据库之前,需要先创建一个MySQL对象,创建MySQL对象的函数如下:
MYSQL* mysql_init(MYSQL *mysql);
- 该函数用来分配或者初始化一个MySQL对象,用于连接MySQL服务器。
- 如果传入的参数是NULL,那么mysql_init将自动为你分配一个MySQL对象并返回。
- 如果传入的参数是一个地址,那么mysql_init将在该地址处帮你完成初始化。
MYSQL对象中包含了各种信息,其类型定义如下:
typedef struct st_mysql {NET net; /* Communication parameters */unsigned char *connector_fd; /* ConnectorFd for SSL */char *host,*user,*passwd,*unix_socket,*server_version,*host_info;char *info, *db;struct charset_info_st *charset;MYSQL_FIELD *fields;MEM_ROOT field_alloc;my_ulonglong affected_rows;my_ulonglong insert_id; /* id if insert on table with NEXTNR */my_ulonglong extra_info; /* Not used */unsigned long thread_id; /* Id for connection in server */unsigned long packet_length;unsigned int port;unsigned long client_flag,server_capabilities;unsigned int protocol_version;unsigned int field_count;unsigned int server_status;unsigned int server_language;unsigned int warning_count;struct st_mysql_options options;enum mysql_status status;my_bool free_me; /* If free in mysql_close */my_bool reconnect; /* set to 1 if automatic reconnect *//* session-wide random string */char scramble[SCRAMBLE_LENGTH+1];my_bool unused1;void *unused2, *unused3, *unused4, *unused5;LIST *stmts; /* list of all statements */const struct st_mysql_methods *methods;void *thd;/*Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flagfrom mysql_stmt_close if close had to cancel result set of this object.*/my_bool *unbuffered_fetch_owner;/* needed for embedded server - no net buffer to store the 'info' */char *info_buffer;void *extension;
} MYSQL;
- MYSQL对象中的methods变量是一个结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
创建完MySQL对象后就可以连接数据库了,连接数据库的函数如下:
MYSQL* mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag);
- mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
- host: 表示需要连接的MySQL服务器的IP地址,"127.0.0.1"表示连接本地MySQL服务器。
- user: 表示连接MySQL服务器时,所使用用户的用户名。
- passwd: 表示连接MySQL服务器时,所使用用户的密码
- db: 表示连接MySQL服务器后,需要使用的数据库。
- port: 表示连接的MySQL服务器,所对应的端口号。
- unix_socket: 表示连接时应该使用的套接字或命名管道,通常设置为NULL。
- clientflag: 可以设置为多个标志位的组合,表示允许特定的功能,通常设置为0。
返回值:
- 如果连接数据库成功,则返回一个MySQL对象,该对象与第一个参数的值相同。
- 如果连接数据库失败,则返回NULL。
与数据库交互完毕后,需要关闭数据库连接,关闭数据库连接的函数如下:
void mysql_close(MYSQL *sock);
- 该函数的参数,就是连接数据库前调用mysql_init创建的MySQL对象。
- 如果传入的MySQL对象是mysql_init自动创建的,那么调用mysql_close时就会释放这个对象。
4. C/C++链接示例
比如使用如下代码连接我的MySQL服务器:
#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;const string host = "116.205.138.41";
const string user = "GR";
const string passwd = "@369rtxRTX";
const string db = "connect_demon";
const int port = 3306;int main()
{//1、创建MySQL对象MYSQL* ms = mysql_init(nullptr);//2、连接数据库if(mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr<<"数据库连接失败"<<endl;return 1;}cout<<"数据库连接成功"<<endl;//3、关闭数据库mysql_close(ms);cout<<"数据库关闭成功"<<endl;return 0;
}
使用g++生成可执行程序,运行后即可看到连接数据库成功、关闭数据库成功。
5. 发送SQL请求
与数据库建立连接期间,就可以向MySQL服务器下发SQL请求,下发SQL请求的函数如下:
int mysql_query(MYSQL *mysql, const char *q);
- mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
- q: 表示向MySQL服务器下发的SQL请求,SQL最后可以不带分号。
返回值:
- 返回值为0表示SQL执行成功,否则表示SQL执行失败。
在连接数据库之后,需要统一客户端和服务器的编码格式,避免在数据交互过程中出现乱码,设置编码格式的函数如下:
int mysql_set_character_set(MYSQL *mysql, const char *csname);
- mysql: 表示在连接数据库前,调用mysql_init函数创建的MySQL对象。
- csname: 表示要设置的编码格式,如"utf8"。
返回值:
- 返回值为0表示设置成功,否则表示设置失败。
下面在与MySQL数据库交互时,访问的都是connect_demon数据库,该数据库下有一个user表,表中有三条记录。如下:
在调用mysql_query函数时,向MySQL服务器下发一条insert SQL。如下:
#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;const string host = "116.205.138.41";
const string user = "GR";
const string passwd = "@369rtxRTX";
const string db = "connect_demon";
const int port = 3306;int main()
{//1、创建MySQL对象MYSQL* ms = mysql_init(nullptr);//2、连接数据库if (mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr << "数据库连接失败" << endl;return 1;}cout << "数据库连接成功" << endl;mysql_set_character_set(ms, "utf8"); //设置编码格式为utf8//3、向数据库表中插入记录std:string sql = "insert into user values (4,'赵六',25)";if (mysql_query(ms, sql.c_str()) != 0){cout << "插入数据失败" << endl;return 2;}cout << "插入数据成功" << endl;//4、关闭数据库mysql_close(ms);cout << "数据库关闭成功" << endl;return 0;
}
生成可执行程序,运行后在MySQL中即可看到对应数据被成功插入。如下:
删除和更新也和插入的做法一样。
6. 获取查询结果
- 对数据库中的数据进行增删改操作时,都只需要调用mysql_query向服务器下发对应的SQL请求。
- 而对数据库中的数据进行查询操作时,除了需要调用mysql_query向服务器下发对应的查询SQL,还需要获取查询结果。
获取查询结果的函数如下:
MYSQL_RES* mysql_store_result(MYSQL *mysql);
- 该函数会调用指定MySQL对象中对应的函数指针来获取查询结果,并将获取到的查询结果保存到MYSQL_RES变量中进行返回。
- 需要注意的是,MYSQL_RES变量的内存空间是malloc出来的,因此在使用完后需要调用free函数进行释放,否则会造成内存泄露。
MYSQL_RES变量中保存了查询得到的各种信息,其类型定义如下:
typedef struct st_mysql_res {my_ulonglong row_count;MYSQL_FIELD *fields;MYSQL_DATA *data;MYSQL_ROWS *data_cursor;unsigned long *lengths; /* column lengths of current row */MYSQL *handle; /* for unbuffered reads */const struct st_mysql_methods *methods;MYSQL_ROW row; /* If unbuffered read */MYSQL_ROW current_row; /* buffer to current row */MEM_ROOT field_alloc;unsigned int field_count, current_field;my_bool eof; /* Used by mysql_fetch_row *//* mysql_stmt_close() had to cancel this result */my_bool unbuffered_fetch_cancelled;void *extension;
} MYSQL_RES;
获取查询结果的行数的函数如下:
my_ulonglong mysql_num_rows(MYSQL_RES *res);
- 该函数将会从指定的MYSQL_RES对象中,获取查询结果的行数。
获取查询结果的列数的函数如下:
unsigned int mysql_num_fields(MYSQL_RES *res);
- 该函数将会从指定的MYSQL_RES对象中,获取查询结果的列数。
获取查询结果的列属性的函数如下:
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
- 该函数将会从指定的MYSQL_RES对象中,获取查询结果的列属性。
mysql_fetch_fields函数将会返回多个MYSQL_FIELD对象,每个MYSQL_FIELD对象中保存着对应列的各种列属性,其类型定义如下:
typedef struct st_mysql_field {char *name; /* Name of column */char *org_name; /* Original column name, if an alias */char *table; /* Table of column if column was a field */char *org_table; /* Org table name, if table was an alias */char *db; /* Database for table */char *catalog; /* Catalog for table */char *def; /* Default value (set by mysql_list_fields) */unsigned long length; /* Width of column (create length) */unsigned long max_length; /* Max width for selected set */unsigned int name_length;unsigned int org_name_length;unsigned int table_length;unsigned int org_table_length;unsigned int db_length;unsigned int catalog_length;unsigned int def_length;unsigned int flags; /* Div flags */unsigned int decimals; /* Number of decimals in field */unsigned int charsetnr; /* Character set */enum enum_field_types type; /* Type of field. See mysql_com.h for types */void *extension;
} MYSQL_FIELD;
获取查询结果中的一行数据的函数如下:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
- 该函数将会从指定的MYSQL_RES对象中,获取查询结果中的一行数据。
MYSQL_ROW对象中保存着一行数据,这一行数据中可能包含多个字符串,对应就是这行数据中的多个列信息,因此MYSQL_ROW本质就是char**类型,其类型定义如下:
typedef char **MYSQL_ROW; /* return data as array of strings */
比如查询user表中的数据并进行打印输出。如下:
#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;const string host = "116.205.138.41";
const string user = "GR";
const string passwd = "@369rtxRTX";
const string db = "connect_demon";
const int port = 3306;int main()
{//1、创建MySQL对象MYSQL* ms = mysql_init(nullptr);//2、连接数据库if (mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr){cerr << "数据库连接失败" << endl;return 1;}cout << "数据库连接成功" << endl;mysql_set_character_set(ms, "utf8"); //设置编码格式为utf83、向数据库表中插入记录//std:string sql = "insert into user values (4,'赵六',25)";//if (mysql_query(ms, sql.c_str()) != 0)//{// cout << "插入数据失败" << endl;// return 2;//}//cout << "插入数据成功" << endl;//3、查询数据库表中的记录//3.1、执行查询语句std:string sql = "select * from user";if (mysql_query(ms, sql.c_str()) != 0){cout << "查询数据失败" << endl;return 2;}cout << "查询数据成功" << endl;//3.2、获取查询结果MYSQL_RES* res = mysql_store_result(ms);int rows = mysql_num_rows(res); //数据的行数int cols = mysql_num_fields(res); //数据的列数//获取每列的属性并打印列名MYSQL_FIELD* fields = mysql_fetch_fields(res);for (int i = 0;i < cols;i++){cout << fields[i].name << "\t";}cout << endl;for (int i = 0;i < rows;i++){//获取一行数据并进行打印MYSQL_ROW row = mysql_fetch_row(res);for (int j = 0;j < cols;j++){cout << row[j] << "\t";}cout << endl;}free(res); //释放内存空间//4、关闭数据库mysql_close(ms);cout << "数据库关闭成功" << endl;return 0;
}
生成可执行程序,运行后在即可看到数据的查询结果。如下:
本篇完。
此专栏到这就先告一段落了。
相关文章:

MySQL数据库⑪_C/C++连接MySQL_发送请求
目录 1. 下载库文件 2. 使用库 3. 链接MySQL函数 4. C/C链接示例 5. 发送SQL请求 6. 获取查询结果 本篇完。 1. 下载库文件 要使用C/C连接MySQL,需要使用MySQL官网提供的库。 进入MySQL官网选择适合自己平台的mysql connect库,然后点击下载就行…...

选择排序和快速排序(1)
目录 选择排序 基本思想 选择排序的实现 图片实现 代码实现 快速排序 基本思想 快速排序的实现 图片实现 代码实现 选择排序 基本思想 每一次从待排序的数据元素中选出最小(最大)的元素,存放在序列的起始位置,直到全部…...

得物面试:Redis用哈希槽,而不是一致性哈希,为什么?
尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: Redis为何用哈希槽而不用一致性哈希? 最近…...

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果
uintt16位的话会在上面前面加上00,16位的话一定是两个字节,一共16位的数据 如果是unint8的话就不会, 注意这里给的是13,但是现实的00 0D,这是大小端的问题,在matlanb里设置,我们就默认用这个模式…...

二分、快排、堆排与双指针
二分 int Binary_Search(vector<int> A,int key){int nA.size();int low0,highn-1,mid;while(low<high){mid(lowhigh)/2;if(A[mid]key)return mid;else if(A[mid]>key)highmid-1;elselowmid1; }return -1; }折半插入排序 ——找到第一个 ≥ \ge ≥tem的元素 voi…...

微信小程序步数返还的时间戳为什么返回的全是1970?
微信小程序步数返还的时间戳为什么返回的全是1970? 将返回的时间 乘以 1000 再 new Date() 转化就对了 微信返回的是秒S单位的,我们要转化为毫秒ms单位,才能进行格式化日期。 微信给我们下了个坑, 参考: https://d…...

Python函数——函数介绍
一、引言 在Python编程中,函数是构建高效代码的关键。通过创建可重用的代码块,我们可以使程序更加清晰、易读且易于维护。在本文中,我们将深入了解Python函数的基本概念及其特性。 二、Python函数的基本概念 函数是一段具有特定功能的代码块…...

【Linux系统化学习】文件重定向
目录 文件内核对象 文件描述符的分配规则 重定向 重定向的概念 dup2系统调用 输出重定向 追加重定向 输入重定向 stderr解析 重定向到同一个文件中 分离常规输出和错输出 文件内核对象 上篇文章中我们介绍到了操作系统中的文件,操作系统为了方…...

防火墙工作模式详解
防火墙工作模式是指防火墙在网络中的工作方式和策略。常见的防火墙工作模式包括以下几种: 1. 包过滤工作模式:根据事先确定的规则集合,对进出网络的网络包进行过滤和检查。根据规则,防火墙可以允许或阻止特定的网络流量。 2. 代…...

CCF编程能力等级认证GESP—C++6级—20231209
CCF编程能力等级认证GESP—C6级—20231209 单选题(每题 2 分,共 30 分)判断题(每题 2 分,共 20 分)编程题 (每题 25 分,共 50 分)闯关游戏工作沟通 答案及解析单选题判断题编程题1编程题2 单选题…...

ES6 ~ ES11 学习笔记
课程地址 ES6 let let 不能重复声明变量(var 可以) let a; let b, c, d; let e 100; let f 521, g "atguigu", h [];let 具有块级作用域,内层变量外层无法访问 let 不存在变量提升(运行前收集变量和函数&#…...

001 - Hugo, 创建一个网站
001 - Hugo, 创建一个网站安装hugoWindows系统Macos Hugo博客搭建初始化博客主题安装配置博客各个页面开始创作创建 GitHub Page 仓库本地调试和预览发布内容 教程及鸣谢文字教程视频教程 001 - Hugo, 创建一个网站 这篇文章假设你已经: 了解基本的终端命令行知识&…...

前端开发:Vue框架与前端部署
Vue Vue是一套前端框架,免除原生)avaScript中的DOM操作,简化书写。是基于MVVM(Model–View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上。简单来说,就是数据变化的时候, 页面会自动刷新, 页面变化的时…...

【leetcode】深搜、暴搜、回溯、剪枝(C++)3
深搜、暴搜、回溯、剪枝(C)3 一、解数独1、题目描述2、代码3、解析 二、单词搜索1、题目描述2、代码3、解析 三、黄金矿工1、题目描述2、代码3、解析 四、不同路径III1、题目描述2、代码3、解析 一、解数独 1、题目描述 leetcode链接 2、代码 class…...

社区养老|社区养老服务系统|基于springboot社区养老服务系统设计与实现(源码+数据库+文档)
社区养老服务系统目录 目录 基于springboot社区养老服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员部分功能 (1) 用户管理 (2)服务种类管理 (3)社区服务管理 (…...

云计算基础-存储虚拟化(深信服aSAN分布式存储)
什么是存储虚拟化 分布式存储是利用虚拟化技术 “池化”集群存储卷内通用X86服务器中的本地硬盘,实现服务器存储资源的统一整合、管理及调度,最终向上层提供NFS、ISCSI存储接口,供虚拟机根据自身的存储需求自由分配使用资源池中的存储空间。…...

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十二)(3)
实验十二:微分方程模型 练习三 1.分别用数值解命令ode23t和ode45 计算示例3中微分方程的数值解,同用命令ode23 算得的数值解以及解析解比较,哪种方法精度较高?你用什么方法比较它们之间的精度? clc;clear; f(x,y)2*yx2; figure(1) [x,y]ode23t(f,[1,2],1); plo…...

CSS Transition:为网页元素增添优雅过渡效果
随着互联网的发展,网页的视觉效果和用户体验变得尤为重要。CSS Transition作为一种能够让网页元素在状态改变时呈现平滑过渡效果的工具,受到了广大前端开发者的青睐。本文将详细介绍CSS Transition的基本概念、使用方法以及常见应用,帮助读者…...

JDK 17 新特性 (一)
既然 Springboot 3.0 强制使用 JDK 17 那就看看 JDK17 有哪些新特性吧 参考链接 介绍一下 新特性的历史渊源 JDK 17是Java Development Kit(JDK)的一个版本,它是Java编程语言的一种实现。JDK 17于2021年9月14日发布,并作为Java …...

杨中科 ASP.NET DI综合案例
综合案例1 需求说明 1、目的:演示DI的能力; 2、有配置服务、日志服务,然后再开发一个邮件发送器服务。可以通过配置服务来从文件、环境变量、数据库等地方读取配置,可以通过日志服务来将程序运行过程中的日志信息写入文件、控制台、数据库等。 3、说明…...

蓝桥杯嵌入式第12届真题(完成) STM32G431
蓝桥杯嵌入式第12届真题(完成) STM32G431 题目 程序 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**************************…...

C#系列-多线程(4)
在C#中,多线程编程主要涉及使用System.Threading命名空间下的类和接口来创建和管理线程。以下是一些C#多线程编程的基本用法和示例: 1. 使用Thread类创建线程 csharp代码 using System; using System.Threading; class Program { static void …...

VS如何调试C运行时库
C运行时库(简称crt)是C标准库等组件的基础, 其会在进入main函数之前运行一些代码, 包括但不限于初始化堆栈, 内存分配等操作 这些代码是可以随着VC工具集一起安装到我们本地的。看一下这个情况, 就是VS调试器没找到对应的crt源码的情况, 调用堆栈是空的。为了解决这个问…...

软件工程师,超过35岁怎么办
概述 随着科技行业的飞速发展,软件开发工程师的职业道路充满了各种机遇和挑战。对于已经在这个行业摸爬滚打了十多年的软件开发工程师来说,当他们步入35岁这个年纪时,可能会感到一些迷茫和焦虑。许多人担忧,在以创新、活力、快速迭…...

通过 Prometheus 编写 TiDB 巡检脚本(脚本已开源,内附链接)
作者丨 caiyfc 来自神州数码钛合金战队 神州数码钛合金战队是一支致力于为企业提供分布式数据库 TiDB 整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景,全部拥有 TiDB 高级资格证书,并活跃于 TiDB 开源社区,是官方认证合作伙…...

sql语句学习(一)--查询
【有道云笔记】基本sql语句2—查询基础 数据库表结构 DROP TABLE IF EXISTS class; CREATE TABLE class (id int(11) NOT NULL AUTO_INCREMENT,class_num varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 班级号,class_name varchar(255) CHARACTE…...

【HTML】交友软件上照片的遮罩是如何做的
笑谈 我不知道大家有没有在夜深人静的时候感受到孤苦难耐,🐶。于是就去下了一些交友软件来排遣寂寞。可惜的是,有些交友软件真不够意思,连一些漂亮小姐姐的图片都要进行遮罩,完全不考虑兄弟们的感受,😠。所…...

【Java EE初阶十二】网络编程TCP/IP协议(一)
1. 网络编程 通过网络,让两个主机之间能够进行通信->就这样的通信来完成一定的功能,进行网络编程的时候,需要操作系统给咱们提供一组API,通过这些API来完成编程;API可以认为是应用层和传输层之间交互的路径…...

element-ui解决上传文件时需要携带请求数据的问题
一、问题描述 在前端使用element-ui进行文件上传时,需要携带请求头信息,比如Token。 二、问题解决 1. 表单实现 action置空添加:http-request属性覆盖默认的上传行为,实现自定义上传文件。注意:src后的图片路径如果是个网络请求(外链)&…...

【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024
AI视野今日CS.NLP 自然语言处理论文速览 Thu, 18 Jan 2024 Totally 35 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deciphering Textual Authenticity: A Generalized Strategy through the Lens of Large Language Semantics …...