MySQL 的 C 语言接口

1. mysql_init

MYSQL *mysql_init(MYSQL *mysql);

mysql_init函数的作用:创建一个 MYSQL 对象(该对象用于连接数据库)。

mysql_init函数的参数:

① mysql:MYSQL 结构体指针,一般设置为 NULL 。

mysql_init函数的返回值:

① 成功,返回一个指向 MYSQL 对象的指针。

② 失败,返回 NULL 。

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 flag

    from 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 对象里有很多连接基本参数,它也包含了一个叫 st_mysql_methods 的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。

2. mysql_real_connect

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_real_connect函数的作用:连接数据库。

mysql_real_connect函数的参数:

① mysql:MYSQL 对象指针。

② host:要连接的 MySQL 服务器的 IP 地址。

③ user:用户名,以哪个用户身份连接。

④ passwd:用户密码。

⑤ db:要连接的数据库。

⑥ port:要连接的 MySQL 服务器的端口号。

⑦ unix_socket:通常设置为 NULL 。

⑧ clientflag:通常设置为 0 。

mysql_real_connect函数的返回值:

① 成功,返回一个指向 MYSQL 对象的指针,与第一个参数 mysql 的值相同。

② 失败,返回 NULL 。

3. mysql_close

void mysql_close(MYSQL *sock);

mysql_close函数的作用:关闭数据库连接。

mysql_close函数的参数:

① sock:MYSQL 对象指针。

mysql_close函数的返回值:无。

4. mysql_set_character_set

在连接数据库之后,需要先统一客户端和服务器的编码格式,避免在数据交互的过程中出现乱码。
int mysql_set_character_set(MYSQL *mysql, const char *csname);

mysql_set_character_set函数的作用:设置编码格式。

mysql_set_character_set函数的参数:

① mysql:MYSQL 对象指针。

② csname:要设置成哪种字符集。

mysql_set_character_set函数的返回值:

① 成功,为 0 。

② 失败,为非 0 。

5. mysql_query
int mysql_query(MYSQL *mysql, const char *q);

mysql_query函数的作用:下发 SQL 请求。

mysql_query函数的参数:

① mysql:MYSQL 对象指针。

② q:要执行的 SQL 语句(语句结尾可以不带分号)。

mysql_query函数的返回值:

① 成功,为 0 。

② 失败,为非 0 。

6. mysql_store_result
MYSQL_RES *mysql_store_result(MYSQL *mysql);

mysql_store_result函数的作用:获取查询结果。

mysql_store_result函数的参数:

① mysql:MYSQL 对象指针。

mysql_store_result函数的返回值:

① 成功,返回一个指向 MYSQL_RES 对象的指针。

② 失败,返回 NULL 。

该函数会调用 MYSQL 变量中的 st_mysql_methods 中对应的函数指针来获取查询结果。

该函数会 malloc 出一个 MYSQL_RES 结构体变量,将获取到的查询结果保存到该变量中,最后返回该变量的指针。

由于 MYSQL_RES 的内存空间是 malloc 出来的,所以在使用完之后一定要记得调用 free 函数(mysql_free_result函数)来释放对应的内存空间,否则会造成内存泄漏。

执行完mysql_store_result以后,其实要查询的数据都已经在 MYSQL_RES 变量中了,下面的函数基本就是读取 MYSQL_RES 中的数据,参数都是 MYSQL_RES 对象指针:

// 获取结果的行数

my_ulonglong mysql_num_rows(MYSQL_RES *res);

// 获取结果的列数

unsigned int mysql_num_fields(MYSQL_RES *res);

// 获取结果的列属性

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

// 获取结果中的一行记录

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

关于mysql_fetch_row函数的返回值 MYSQL_ROW:

MYSQL_ROW,即结果中的一行记录,对应着多个列信息,实际上就是一个字符串数组,因此,MYSQL_ROW 类型,本质就是 char** 类型,其定义如下:

typedef char **MYSQL_ROW;                /* return data as array of strings */

7.mysql_free_result()

void mysql_free_result(MYSQL_RES *result);

作用:用于释放前面 mysql_store_result 分配的内存。

三、使用示例

1.连接数据库和关闭数据库连接

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

printf("数据库连接成功!\n");

//3、访问数据库

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

2.访问数据库

mysql_query

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

 

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

 

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

 

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

//设置连接的编码格式

mysql_set_character_set(ms, "utf8");

 

printf("数据库连接成功!\n");

 

//3. 访问数据库

//3.1 select 其实是最不好处理的!select sql执行完只是第一步,还需要对数据进一步解析

char sql[] = "select * from orderitems;";

int code = mysql_query(ms, sql);

if(code != 0){

printf("execute: %s failed\n", sql);

return 2;

}

printf("execute: %s success\n", sql);

 

//3.2 解析数据 -- 获取行号和列号

MYSQL_RES *result = mysql_store_result(ms);

int rows = mysql_num_rows(result);

int cols = mysql_num_fields(result);

printf("行数:%d,列数:%d\n", rows, cols);

 

//3.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < cols; i++){

printf("%s\t", fields[i].name);

}

printf("\n");

 

//3.4 解析数据 -- 获取表中的数据 -- 重要

for(int i = 0; i < rows; i++){

MYSQL_ROW line = mysql_fetch_row(result);  // 获取完整的一行记录(默认从前往后)

for(int j = 0; j < cols; j++){

printf("%s\t", line[j]);  // 将一行记录内部的多列字符串依次打印

}

printf("\n");

}

 

mysql_free_result(result); // 释放内存空间

 

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

 

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

 

// 查询表的内容

int select(MYSQL* ms)

{

//3.1 select 其实是最不好处理的!select sql执行完只是第一步,还需要对数据进一步解析

char sql[] = "select * from man;";

int code = mysql_query(ms, sql);

if(code != 0){

printf("execute: %s failed\n", sql);

return 2;

}

printf("execute: %s success\n", sql);

 

//3.2 解析数据 -- 获取行号和列号

MYSQL_RES *result = mysql_store_result(ms);

int rows = mysql_num_rows(result);

int cols = mysql_num_fields(result);

printf("行数:%d,列数:%d\n", rows, cols);

 

//3.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < cols; i++){

printf("%s\t", fields[i].name);

}

printf("\n");

 

//3.4 解析数据 -- 获取表中的数据 -- 重要

for(int i = 0; i < rows; i++){

MYSQL_ROW line = mysql_fetch_row(result);  // 获取完整的一行记录(默认从前往后)

for(int j = 0; j < cols; j++){

printf("%s\t", line[j]);  // 将一行记录内部的多列字符串依次打印

}

printf("\n");

}

 

mysql_free_result(result); // 释放内存空间

return 0;

}

 

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

 

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

//设置连接的编码格式

mysql_set_character_set(ms, "gb2312");

 

printf("数据库连接成功!\n");

 

//3. 访问数据库

select(ms);        

 

// insert 操作

char sql_insert[] = "insert into man values (\'小刚\', 19);";

int res = mysql_query(ms, sql_insert);

if(res != 0){

printf("execute: %s failed\n", sql_insert);

return 2;

}

printf("execute: %s success\n", sql_insert);

 

select(ms);

 

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

 

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

 

// 查询表的内容

int select(MYSQL* ms)

{

//3.1 select 其实是最不好处理的!select sql执行完只是第一步,还需要对数据进一步解析

char sql[] = "select * from man;";

int code = mysql_query(ms, sql);

if(code != 0){

printf("execute: %s failed\n", sql);

return 2;

}

printf("execute: %s success\n", sql);

 

//3.2 解析数据 -- 获取行号和列号

MYSQL_RES *result = mysql_store_result(ms);

int rows = mysql_num_rows(result);

int cols = mysql_num_fields(result);

printf("行数:%d,列数:%d\n", rows, cols);

 

//3.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < cols; i++){

printf("%s\t", fields[i].name);

}

printf("\n");

 

//3.4 解析数据 -- 获取表中的数据 -- 重要

for(int i = 0; i < rows; i++){

MYSQL_ROW line = mysql_fetch_row(result);  // 获取完整的一行记录(默认从前往后)

for(int j = 0; j < cols; j++){

printf("%s\t", line[j]);  // 将一行记录内部的多列字符串依次打印

}

printf("\n");

}

 

mysql_free_result(result); // 释放内存空间

return 0;

}

 

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

 

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

//设置连接的编码格式

mysql_set_character_set(ms, "gb2312");

 

printf("数据库连接成功!\n");

 

//3. 访问数据库

select(ms);        

 

// delete 操作

char sql_delete[] = "delete from man where name=\'小刚\'";

int res = mysql_query(ms, sql_delete);

if(res != 0){

printf("execute: %s failed\n", sql_delete);

return 2;

}

printf("execute: %s success\n", sql_delete);

 

select(ms);

 

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

#include <stdio.h>

#include <winsock.h>

#include <mysql.h>

 

const char host[] = "127.0.0.1";        // MySQL所在机器的ip

const int port = 0;                                        // MySQL所在机器的端口

const char db[] = "test";                        // 数据库名

const char user[] = "root";                        // 用户名

const char passwd[] = "test123";        // 用户密码

 

// 查询表的内容

int select(MYSQL* ms)

{

//3.1 select 其实是最不好处理的!select sql执行完只是第一步,还需要对数据进一步解析

char sql[] = "select * from man;";

int code = mysql_query(ms, sql);

if(code != 0){

printf("execute: %s failed\n", sql);

return 2;

}

printf("execute: %s success\n", sql);

 

//3.2 解析数据 -- 获取行号和列号

MYSQL_RES *result = mysql_store_result(ms);

int rows = mysql_num_rows(result);

int cols = mysql_num_fields(result);

printf("行数:%d,列数:%d\n", rows, cols);

 

//3.3 解析数据 -- 获取表中列名 -- 一般不用,仅仅是为了测试代码的完整性

MYSQL_FIELD *fields = mysql_fetch_fields(result);

for(int i = 0; i < cols; i++){

printf("%s\t", fields[i].name);

}

printf("\n");

 

//3.4 解析数据 -- 获取表中的数据 -- 重要

for(int i = 0; i < rows; i++){

MYSQL_ROW line = mysql_fetch_row(result);  // 获取完整的一行记录(默认从前往后)

for(int j = 0; j < cols; j++){

printf("%s\t", line[j]);  // 将一行记录内部的多列字符串依次打印

}

printf("\n");

}

 

mysql_free_result(result); // 释放内存空间

return 0;

}

 

int main()

{

//1、获取MySQL实例(相当于创建了一个MySQL句柄)

MYSQL* ms = mysql_init(nullptr);

 

//2、连接数据库

if(mysql_real_connect(ms, host, user, passwd, db, port, nullptr, 0) == nullptr) {

printf("数据库连接失败!\n");

return 1;

}

//设置连接的编码格式

mysql_set_character_set(ms, "gb2312");

 

printf("数据库连接成功!\n");

 

//3. 访问数据库

select(ms);        

 

// update 操作

char sql_update[] = "update man set age = 20 where name=\'小明\'";

int res = mysql_query(ms, sql_update);

if(res != 0){

printf("execute: %s failed\n", sql_update);

return 2;

}

printf("execute: %s success\n", sql_update);

 

select(ms);

 

//4、关闭数据库连接

mysql_close(ms);

printf("数据库连接关闭成功!\n");

return 0;

}

  • 执行 update 操作:
  • 执行 delete 操作:
  • 执行 insert 操作:
  • 执行 select 操作:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/145334.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PL/SQL+cpolar公网访问内网Oracle数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

JVM111

JVM1 字节码与多语言混合编程 字节码 我们平时说的java字节码&#xff0c; 指的是用java语言编译成的字节码。准确的说任何能在jvm平台上执行的字节码格式都是一样的。所以应该统称为:jvm字节码。不同的编译器&#xff0c;可以编译出相同的字节码文件&#xff0c;字节码文件…

十五、异常(4)

本章概要 Java 标志异常 特例&#xff1a;RuntimeException 使用 finally 进行清理 finally 用来做什么&#xff1f;在 return 中使用 finally缺憾&#xff1a;异常丢失 Java 标准异常 Throwable 这个 Java 类被用来表示任何可以作为异常被抛出的类。Throwable 对象可分为两…

配置OSPF路由

OSPF路由 1.OSPF路由 1.1 OSPF简介 OSPF(Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;路由协议是另一个比较常用的路由协议之一&#xff0c;它通过路由器之间通告网络接口的状态&#xff0c;使用最短路径算法建立路由表。在生成路由表时&#xff0c;…

LLM-TAP随笔——大语言模型基础【深度学习】【PyTorch】【LLM】

文章目录 2.大语言模型基础2.1、编码器和解码器架构2.2、注意力机制2.2.1、注意力机制&#xff08;Attention&#xff09;2.2.2、自注意力机制&#xff08;Self-attention&#xff09;2.2.3、多头自注意力&#xff08;Multi-headed Self-attention&#xff09; 2.3、transforme…

华为摄像头智能安防监控解决方案

云时代来袭&#xff0c;数字化正在从园区办公延伸到生产和运营的方方面面&#xff0c;智慧校园&#xff0c;柔性制造&#xff0c;掌上金融和电子政务等&#xff0c;面对各种各样的新兴业态的涌现&#xff0c;企业需要构建一张无所不联、随心体验、业务永续的全无线网络&#xf…

国内大语言模型的相对比较:ChatGLM2-6B、BAICHUAN2-7B、通义千问-6B、ChatGPT3.5

一、 前言 国产大模型有很多&#xff0c;比如文心一言、通义千问、星火、MOSS 和 ChatGLM 等等&#xff0c;但现在明确可以部署在本地并且开放 api 的只有 MOOS 和 ChatGLM。MOOS 由于需要的 GPU 显存过大&#xff08;不量化的情况下需要80GB&#xff0c;多轮对话还是会爆显存…

TSM动作识别模型【详解】

文章目录 本文使用的是somethingv2数据集&#xff0c;解压后是如下形式&#xff1b; 由于该压缩数据进行了分卷操作&#xff0c;需要合并后才能进行解压。首先我们将下面4个json文件剪贴到其他文件夹&#xff0c;只保留00-19的文件&#xff0c;然后在该文件夹下打开cmd&#xf…

【图像分割】图像检测(分割、特征提取)、各种特征(面积等)的测量和过滤(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python 笔记06(Mysql数据库)

一 基础 1.1 安装 MySQL下载参考&#xff1a;MySQL8.0安装配置教程【超级详细图解】-CSDN博客 测试是否安装并正确配置环境变量&#xff1a; 1.2 查看服务器是否正常运行 1.3 显示数据库 show databases; 1.4 退出 exit 1.5 python 连接 1.6 查主机IP ipconfig

一篇文章教你自动化测试如何解析excel文件?

前言 自动化测试中我们存放数据无非是使用文件或者数据库&#xff0c;那么文件可以是csv&#xff0c;xlsx&#xff0c;xml&#xff0c;甚至是txt文件&#xff0c;通常excel文件往往是我们的首选&#xff0c;无论是编写测试用例还是存放测试数据&#xff0c;excel都是很方便的。…

SpringBoot使用Docker并上传至DockerHub

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 文章目录 1.系列文章2.构建docker镜像的方式3.docker操作3.1 安装docker3.2 查看docker镜像3.3 本地运行docker3.4 修改tag3.5 推送docker镜像3.6 远端server拉取d…

Linux 集锦 之 最常用的几个命令

Linux最常用的几个命令 ​ Linux系统中的命令那是相当地丰富&#xff0c;不同的版本可能还有不同的命令&#xff0c;不过Linux核心自带的命令大概有几百个&#xff0c;这个不管是什么发行版一般都是共用的。 ​ 如果希望探索Linux的所有命令&#xff0c;可能不太实际&#xf…

树莓派基本配置(2)

安装motion $sudo apt-get update $sudo apt-get install motion配置motion sudo nano /etc/default/motionsudo nano /etc/motion/motion.conf主要改这些参数 //让Motion作为守护进程运行 daemon on ... //用这个端口号来读取数据 stream_port 8081 ... //网络上其它主机…

力扣刷题-哈希表-求两个数组的交集

349 求两个数组的交集 题意&#xff1a;给定两个数组&#xff0c;编写一个函数来计算它们的交集。注意&#xff1a;输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 提示&#xff1a; 1 < nums1.length, nums2.length < 1000 0 < nums1[i], …

nodejs在pdf中绘制表格

需求 之前我已经了解过如何在pdf模板中填写字段了 nodejs根据pdf模板填入中文数据并生成新的pdf文件https://blog.csdn.net/ArmadaDK/article/details/132456324 但是当我具体使用的时候&#xff0c;我发现我的模板里面有表格&#xff0c;表格的长度是不固定的&#xff0c;所…

WPF 03

staticResource和dynamicResource的区别 首先看一个案例 MainWindow.xaml <Window x:Class"WpfDay03.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&quo…

Springboot中slf4j日志的简单应用

1、注入依赖&#xff08;pom.xml&#xff09; <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.9</version> &…

从MVC到DDD,该如何下手重构?

作者&#xff1a;付政委 博客&#xff1a;bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主小傅哥。多年的 DDD 应用&#xff0c;使我开了技术的眼界&#xff01; MVC 旧工程腐化严重&#xff0c;…

排序算法之【希尔排序】

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…