当前位置: 首页 > news >正文

C语言中10个字符串函数详解

目录

1.strlen

2.strcpy

3.strcat

4.strcmp

5.strncpy

6.strncat

7.strncmp

8.strstr

9.strtok

10.strerror

1.strlen

  • 基本结构:size_t strlen(const char *str);
  • 功能:用于计算字符串的长度;
  • 字符串已经 '0'作为结束标志,strlen函数返回的是在字符串中'\0’前面出现的字符个数;
  • 参数指向的字符串必须要以'0'结束;
  • 注意函数的返回值为size_t,是无符号的(易错);

(1)库函数用法

#include <string.h>
int main()
{char arr[] = "abc";char arr1[] = { 'a', 'b', 'c' };int len = strlen(arr);int len1 = strlen(arr);printf("%d\n", len);printf("%d\n", len1);  //随机值,arr1没得'\0'return 0;
}

(2)自定义函数 - 模拟实现strlen

可以分为三种写法:计数器版本、递归版本和指针减去指针版本。

//a.计算器版本
#include <assert.h>
int my_strlen(const char* str)   //str数组名表示数组第一个元素地址
{int count = 0;   //计数器assert(str != NULL);   //断言,确保str不是空指针while (*str != '\0'){count++;str++;}return count;
}//b.递归版本
int my_strlen(char* str)
{if (*str != '\0')return 1 + my_strlen(str + 1);elsereturn 0;
}//c.指针减去指针的版本
int my_strlen(char* str)
{char* start = str;while (*str != '\0'){str++;}return str - start;
}int main()
{char arr[] = "abc";int len = my_strlen(arr);printf("%d\n", len);return 0;
}

2.strcpy

  • 基本结构:char* strcpy(char *destination,const char *source );
  • 功能:用于字符串的复制;
  • 源字符串必须以'\0'结束;
  • 会将源字符串中的'0'拷贝到目标空间;
  • 目标空间必须足够大,以确保能存放源字符串;
  • 目标空间必须可变。

(1)库函数用法

int main()
{//a.正确用法char arr[20] = "#############";strcpy(arr, "hello");printf("%s\n", arr);//b.错位用法:源字符串中必须包括'\0'//char arr1[] = { 'a', 'b', 'c' };   //不行,拷贝的时候必须带'\0'//strcpy(arr, arr2);//c.错误用法:目标空间必须足够大,能放下源字符串//char arr[5] = "#####";//char *p = "hello word";//strcpy(arr, p);//d.错误用法:目标空间必须可变。//char* str = "###########";//char *p = "hello word";//strcpy(str, p);	return 0;
}

(2)模拟实现strcpy

#include <assert.h>char* my_strcpy(char* dest, const char* src)
{char* start = dest; // 保存 dest 的初始值  assert(dest&&src != NULL);while ((*dest++ = *src++) != '\0'){// 复制字符,直到 '\0'  }return start; // 返回目标字符串的起始地址  
}int main()
{char src[] = "Hello World!";char dest[50]; // 确保目标缓冲区足够大,以避免溢出  my_strcpy(dest, src);printf("Copied string: %s\n", dest);return 0;
}

3.strcat

  • 实现功能:字符串追加;
  • char* strcat(char*destination,const char*source );
  • 源字符串必须以'0'结束;
  • 目标空间必须有足够的大,能容纳下源字符串的内容;
  • 目标空间必须可修改。

(1)库函数

int main()
{//在hello后面加上wordchar arr[20] = "hello ";strcat(arr, "word");printf("%s\n", arr);return 0;
}

(2)模拟实现

#include <assert.h>
char* my_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src != NULL);//a.找到目标字符串的'\0'while (*dest){dest++;}//b.源数据追加过去,包含'\0'while (*dest++ = *src++){;}return ret;  //返回目标空间的起始地址
}int main()
{//在hello后面加上wordchar arr1[20] = "hello ";char arr2[] = "world";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

4.strcmp

  • 实现功能:用来比较两个字符串大小(比较对应位置的ASII值);
  • 基本结构:int strcmp(const char* strl, const char* str2);
  • 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

(1)库函数

int main()
{int ret = strcmp("abbb", "abq");   //<0//int ret = strcmp("sit", "sit");printf("%d\n", ret);return 0;
}

(2)模拟实现

#include <assert.h>
int my_strcmp(const char* s1, const char* s2)
{assert(s1&&s2 != NULL);while (*s1 == *s2){if (*s1 == '\0'){return 0;}s1++;s2++;}a.第一种写法//if (*s1 > *s2)//{//	return 1;//}//else//{//	return -1;//}//b.第二种写法:只要返回的值满足体条件即可return *s1 - *s2;
}int main()
{char* p = "abcdef";char* q = "abbb";int ret = my_strcmp(p, q);   if (ret > 0){printf("p > q\n");}else if(ret < 0){printf("p < q\n");}else{printf("p == q\n");}return 0;
}

5.strncpy

基本结构:char* strncpy(char* destination, const char* source, size t num);

参数说明:

  • dest:目标字符串的指针,即要复制到的位置。该位置必须有足够的空间来容纳复制的字符以及可能的空字符\0(如果源字符串长度小于n)。
  • src:源字符串的指针,即要从中复制的字符串。
  • n:要复制的最大字符数(包括空字符\0,但实际上strncpy并不保证在复制n个字符后自动添加\0)。

功能:将源字符串src的前n个字符复制到目标字符串dest中。

int main()
{char arr1[10] = "aaaaaaaa";char arr2[] = "hhhh";strncpy(arr1, arr2, 2);printf("%s\n", arr1);   //hhaaaaaareturn 0;
}

6.strncat

基本结构:char* strncat(char*destination, const char* source, size_t num)

参数说明:

  • dest:目标字符串的指针,即要将源字符串追加到的位置。该位置必须有足够的空间来容纳追加的字符以及额外的空字符\0
  • src:源字符串的指针,即要追加的字符串。
  • n:要追加的最大字符数。如果源字符串的长度小于n,则会将源字符串的全部字符追加到目标字符串中;如果源字符串的长度大于或等于n,则只会追加前n个字符。

功能:strncat函数将源字符串src的前n个字符追加到目标字符串dest的末尾,并在追加完成后在dest的末尾添加一个空字符\0。

int main()
{char arr1[10] = "hello ";char arr2[] = "word";strncat(arr1, arr2, 3);printf("%s\n", arr1);   //hello worreturn 0;
}

7.strncmp

基本结构:int strncmp(const char* strl, const char* str2, size_t num );

参数说明:

  • str1:指向第一个要比较的字符串的指针。
  • str2:指向第二个要比较的字符串的指针。
  • n:要比较的字符数。

实现功能:strncmp函数逐个比较str1str2的前n个字符(或直到遇到第一个空字符\0,以先到者为准)。根据比较结果,函数返回一个整数,表示两个字符串在比较的前n个字符中的相对顺序。

返回值:

  • 如果str1str2的前n个字符完全相同(或者在比较过程中遇到了空字符\0),则strncmp返回0。
  • 如果str1在字典顺序上小于str2(即str1的第一个不同字符的ASCII值小于str2的对应字符),则strncmp返回一个负整数。
  • 如果str1在字典顺序上大于str2(即str1的第一个不同字符的ASCII值大于str2的对应字符),则strncmp返回一个正整数。
int main()
{char* p = "abcdef";char* q = "abcqwert";//int ret = strcmp(p, q);int ret = strncmp(p, q, 1);printf("%d\n", ret);return 0;
}

8.strstr

基本结构:char* strstr(const char*,const char*);

参数:

  • str1:被查找的字符串(目标字符串)。
  • str2:要查找的子字符串。

功能:用于判断一个字符串(str2)是否是另一个字符串(str1)的子串。如果str2是str1的子串,则函数返回str2在str1中首次出现的地址(即指向str1中str2首次出现位置的指针);如果str2不是str1的子串,则返回NULL。

(1)库函数

int main()
{char arr1[] = "abcdef";char arr2[] = "bcd";在arr1中查找是否包含arr2数组char* ret = strstr(arr1, arr2);if (ret == NULL){printf("没找到\n");}else{printf("找到了:%s\n", ret);}return 0;
}

(2)模拟实现

#include <assert.h>
char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);const char* s1 = NULL;const char* s2 = NULL;char* cp = str1;while (*cp ){s1 = cp;s2 = str2;while (*s1 && *s2 && (*s1 == *s2)){s1++;s2++;}if (*s2 == '\0')   //找到了{return (char*)cp;}cp++;}return NULL;
}int main()
{char arr1[] = "abbbbcdef";char arr2[] = "bbc";//在arr1中查找是否包含arr2数组char* ret = my_strstr(arr1, arr2);if (ret == NULL){printf("没找到\n");}else{printf("找到了:%s\n", ret);}return 0;
}

9.strtok

  • 功能:切割一个字符串
  • 结构:char* strtok(char* str, const char* sep);
  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL指针
int main()
{char arr[] = "3033433807@qq.com";char* p = "@.";char tmp[20] = { 0 };strcpy(tmp, arr);char* ret = NULL;(1)第一种写法:麻烦//ret = strtok(tmp, p);//printf("%s\n", ret);//ret = strtok(NULL, p);//printf("%s\n", ret);//ret = strtok(NULL, p);//printf("%s\n", ret);//第二种写法:简洁for (ret = strtok(tmp, p); ret != NULL; ret=strtok(NULL,p)){printf("%s\n", ret);}return 0;
}

10.strerror

  • 结构:char* strerror(int errnum );
  • 功能:返回错误码,所对应的错误信息。
  • 使用库函数,调用失败的时候,都会设置错误码
  • int errno - 全局变量
  • 和它对应的一个库函数:perror - 直接打印错误信息,没得错误码
#include <errno.h>
int main()
{//下面每个错误码,就会有对应的错误信息//printf("%s\n", strerror(0));   //printf("%s\n", strerror(1));//printf("%s\n", strerror(2));//printf("%s\n", strerror(3));//printf("%s\n", strerror(4));//printf("%s\n", strerror(5));FILE* pf = fopen("test.txt", "r");if (pf == NULL){//printf("%s\n", strerror(errno));perror("fopen");return 1;}return 0;
}

相关文章:

C语言中10个字符串函数详解

目录 1.strlen 2.strcpy 3.strcat 4.strcmp 5.strncpy 6.strncat 7.strncmp 8.strstr 9.strtok 10.strerror 1.strlen 基本结构&#xff1a;size_t strlen(const char *str)&#xff1b;功能&#xff1a;用于计算字符串的长度&#xff1b;字符串已经 0作为结束标志…...

flume系列之:查询多个flume agent组是否有topic重复接入情况

flume系列之:查询多个flume agent组是否有topic重复接入情况 一、查询zk节点下的flume agent组二、获取采集的topic三、获取重复接入的topic,支持设置重复接入白名单四、执行流程五、完整代码一、查询zk节点下的flume agent组 def get_flumeAgent_zkPath(zkRootPaths):for z…...

Windows自动化1️⃣环境搭建WinAppDriver

对于技术选型: 我尝试了, pywinauto, WinAppDriver,CukeTest 担心CukeTest可能会收费, 尝试pywinauto,在元素点击,搜索时, 遇到不可用情况; WinAppDriver是微软家的,大厂开源, 就它了! 步骤一&#xff1a;安装WinAppDriver 进入WinAppDriver下载页面&#xff08;https://githu…...

云服务器Docker内部署服务后,端口无法访问?

云服务器Docker内部署服务后&#xff0c;端口无法访问&#xff0c;可以按照以下思路进行排查&#xff1a; 以【docker run --name my-nginx -d -p 9395:80 nginx】举例&#xff1a; 查看Docker映射是否正确&#xff0c;可使用docker ps命令查看。Docker是否设置端口映射&#…...

Unity将摄像机视角保存成Json文件方便读取使用

系列文章目录 unity工具 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、设置环境&#x1f449;二、代码如下&#x1f449;三、使用方法 &#x1f449;四、下次外部调用json里面的摄像机位置的时候如下代码方法&#x1f449;壁纸分享&#x1f449;总结 &#x1f449…...

git是什么/基本指令

git作用 去中心化&#xff0c; 分布式版本控制器 新增术语&#xff1a;仓库区&#xff0c; 工作区&#xff0c; 暂存区 具体见下板书 常用git命令 git clone 仓库网址 git status 查看仓库状态 git add newfile 临时添加到git仓库 git commit -m 正式添加git仓库 g…...

Linux 中的同步机制

代码基于&#xff1a;Kernel 6.6 临界资源&#xff1a;指哪些在同一时刻只允许被一个线程访问的软件或硬件资源。这种资源的特点是&#xff0c;如果有线程正在使用&#xff0c;其他进程必须等待直到该线程释放资源。 临界区&#xff1a;指在每个线程中访问临界资源的那段代码。…...

Day17 枚举、typedef、位运算、堆空间的学习

目录 枚举 typedef 位运算 堆上的空间 枚举 一个一个列举出来&#xff0c;是指将变量的值一一列举出来&#xff0c;变量的值只限于列举出来的值的范围内。 作用&#xff1a; 1、为了提高代码的可读性 2、提高代码的安全性 枚举类型 基本语法&#xff1a; enum 枚举名 { …...

Python爬虫与数据分析:中国大学排名的深度挖掘

前言 &#x1f449; 小编已经为大家准备好了完整的代码和完整的Python学习资料&#xff0c;朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取【保证100%免费】 一、选题背景 高考作为中国学生生涯中最为重要的事&#xff0c;在高考之后&#xff0c;选择一所…...

微软开源库 Detours 详细介绍与使用实例分享

目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口&#xff0c;实现对程序异常的拦截 C软件异常排查从入门到精通…...

js中的getElementById的使用方法

在JavaScript中&#xff0c;document.getElementById()是一种用于通过元素的id属性获取DOM元素的方法。它的作用是返回与指定id匹配的HTML元素。 使用document.getElementById()可以通过元素的id属性直接获取该元素的引用&#xff0c;然后可以使用该引用对元素进行各种操作。例…...

设计模式 - 桥接模式

💝💝💝首先,欢迎各位来到我的博客!本文深入理解设计模式原理、应用技巧、强调实战操作,提供代码示例和解决方案,适合有一定编程基础并希望提升设计能力的开发者,帮助读者快速掌握并灵活运用设计模式。 💝💝💝如有需要请大家订阅我的专栏【设计模式】哟!我会定…...

LeetCode530 二叉搜索树的最小绝对差

前言 题目&#xff1a; 530. 二叉搜索树的最小绝对差 文档&#xff1a; 代码随想录——二叉搜索树的最小绝对差 编程语言&#xff1a; C 解题状态&#xff1a; 成功解决&#xff01; 思路 注意题目中的二叉搜索树&#xff0c;这个条件暗示每个节点的左子节点肯定小于该节点&am…...

【STM32 FreeRTOS】信号量与互斥锁

二值信号量 二值信号量的本质是一个队列长度为1的队列&#xff0c;该队列就只有空和满两种情况&#xff0c;这就是二值。 二值信号量通常用于互斥访问或任务同步&#xff0c;与互斥信号量比较类似&#xff0c;但是二值信号量有可能会导致优先级翻转的问题&#xff0c;所以二值…...

SP:eric 靶场复现【附代码】(权限提升)

靶机下载地址&#xff1a; https://www.vulnhub.com/entry/sp-eric,274/https://www.vulnhub.com/entry/sp-eric,274/ 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:75:19:80 1.2. 端口扫描 nmap 192.168.7.104 -p…...

SpringBoot项目启动直接结束--已解决

点击启动类&#xff0c;项目启动了&#xff0c;但是却直接停止了。遇到这个问题如何解决呢&#xff1f; 想要项目一直启动是要部署在tomcat服务器上面了&#xff0c;说明现在项目没有运行在tomcat服务器上面。 解决方案: 添加springweb的starter依赖。 <dependency><…...

【笔记】从零开始做一个精灵龙女-画贴图阶段(下)

补充四点&#xff0c;第一&#xff0c;前期画体积用一号或十三号笔刷&#xff0c;压力60&#xff0c;硬度80&#xff0c;体积大一点 2号笔刷比较适合画过渡和软一点的东东 第二&#xff0c; 游戏里面角色原画海报都是发光很亮很透。但是在bp不能画那么亮&#xff0c;因为你进…...

React 学习——react项目中加入echarts图

实现的代码如下&#xff1a; import * as echarts from echarts import { useEffect, useRef } from react; const Home ()>{const chartRef useRef(null);useEffect(()>{// const chartDom document.getElementById(main);//使用id获取节点const chartDom chartRef…...

链表算法题一

​ 旋转链表 旋转链表 首先考虑特殊情况 若给定链表为空表或者单个节点,则直接返回head,不需要旋转操作.题目给定条件范围: 0 < k < 2 ∗ 1 0 9 0 < k < 2 * 10^9 0<k<2∗109,但是受给定链表长度的限制,比如示例2中,k4与k1的效果等价. 那么可以得出kk%l…...

Unity(2022.3.38LTS) - 基础概念

目录 一. 场景 二. 游戏对象 三. 组件 四. 标签 五. 静态游戏对象 六. 保存 一. 场景 Unity 场景是游戏或应用开发中的一个重要概念。 Unity 场景的组成元素&#xff1a; 它通常包含了各种游戏对象&#xff0c;比如 3D 模型、灯光、摄像机、脚本组件、音频源等等。 作用…...

无人机之飞手必看篇

一、熟悉无人机设备 了解你的无人机&#xff1a;熟悉无人机的各个部分&#xff0c;包括遥控器、电池、螺旋桨和摄像头等。 预飞行检查&#xff1a;在每次飞行前进行预检查&#xff0c;确保所有部件正常工作&#xff0c;螺旋桨牢固&#xff0c;电池充满电。 二、选择适当的飞…...

数据结构(11)——二叉搜索树

欢迎来到博主的专栏&#xff1a;数据结构 博主ID:代码小豪 文章目录 二叉搜索树二叉搜索树的声明与定义二叉搜索树的查找二叉搜索树的插入二叉搜索树的中序遍历二叉搜索树的删除 二叉搜索树 二叉搜索树也称二叉排序树&#xff0c;是具备以下特征的二叉树 &#xff08;1&#x…...

如何使用和配置 AWS CLI 环境变量?

欢迎来到雲闪世界。环境变量在配置和保护应用程序方面起着至关重要的作用&#xff0c;在使用 AWS CLI&#xff08;命令行界面&#xff09;时&#xff0c;它们的使用尤其重要。在这篇博客文章中&#xff0c;我们将深入探讨环境变量的世界&#xff0c;探索它们的用途、它们在 AWS…...

七、流程控制

if语句 在go语言中if语句的写法是比较简单的&#xff0c;也是很常见的 func main() {a : trueif a {fmt.Println("a is true")} }if else 语句 func main() {a : trueif !a {fmt.Println("a is true")} else {fmt.Println("a is false")} }el…...

【通过python启动指定的文件】

通过python启动指定的文件 在 Python 中&#xff0c;可以使用os模块的startfile函数&#xff08;在 Windows 系统中&#xff09;或者subprocess模块来启动指定的文件。 以下是使用os模块在 Windows 系统中的示例&#xff1a; import osfile_path "C:\\path\\to\\your\…...

区块链开源的项目有哪些?

区块链领域有许多开源项目&#xff0c;它们覆盖了从基础设施到应用层的不同方面。以下是一些著名的区块链开源项目&#xff1a; 1. Bitcoin (比特币)&#xff1a;第一个去中心化的加密货币&#xff0c;源代码在 GitHub 上开源。它实现了区块链技术的基本概念。 2. Ethereum (…...

3152. 特殊数组 II(24.8.14)

题目 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 你有一个整数数组 nums 和一个二维整数矩阵 queries&#xff0c;对于 queries[i] [fromi, toi]&#xff0c;请你帮助你检查 子数组 nums[fromi…toi] 是不是一个 特殊数组…...

Android 全系统版本文件读写最佳适配,CV 即用(适配到 Android 14)

结合着Android的历史问题&#xff0c;我们需要这样写才行&#xff1a; 首先 manifest 部分 <manifest><!-- Devices running Android 12L (API level 32) or lower --><uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" a…...

【日记】朋友和他女朋友领证了(368 字)

正文 一定程度上感受到了驻场运维的水深火热&#xff0c;感觉成天到晚都在救火。今天下午就给人修了四五台机器…… 回想了一下&#xff0c;今天貌似还真没干什么。毕竟早上睁眼就是 8:35 了&#xff0c;给人吓得半死。 &#xff08;感觉 AI 也很智障&#xff0c;当初就是发现音…...

行业大模型:信用评分大模型、生产优化大模型、库存管理大模型、物流行业大模型、零售行业大模型

金融行业大模型&#xff1a;信用评分大模型 信用评分模型在金融行业中扮演着至关重要的角色&#xff0c;它通过对个人或企业的信用状况进行评估&#xff0c;帮助金融机构有效控制风险&#xff0c;提高业务效率。以下是信用评分模型的特点及案例介绍&#xff1a; 信用评分模型…...

做网站分pc端和移动端的吗/灰色词seo推广

一对一关系以丈夫和妻子模型 配置文件 妻子配置文件&#xff1a; <?xml version"1.0" encoding"utf-8" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hi…...

速度快的wordpress主机/正规网站优化哪个公司好

你知道如何在Excel中计算平方和吗&#xff1f;在Excel中查找平方和是一项重复的任务。最常用的公式需要大量数据输入。下面小编为你介绍一种简单好用的方法&#xff0c;让你可以快速计算平方和&#xff01;Microsoft Excel 2019 for Mac​www.macz.com查找多个单元的平方和在Ex…...

wordpress展览会/北京搜索引擎推广服务

随着学习的不断深入&#xff0c;我们面对的问题也会越来越复杂&#xff0c;为了更好的解决就需要引入各种模块。本节课将会讲述openpyxl模块和csv模块的使用&#xff0c;同时也是为下节课的练习打基础。 1、什么是模块 我们对于模块并不陌生&#xff0c;之前的课程中我们已经通…...

沂源网站开发/上海推广服务

&#xff08;1&#xff09;第一个程序“”“Hello World” 实现python环境打印输出&#xff1a;Hello World 程序&#xff1a; print("Hello World") 数据类型转换 数据类型&#xff1a;int整形&#xff0c;str字符型&#xff0c;不同类性的数据不能相加、减。 正确&…...

做网站编码/seo推广技术

1, Java的基本部分 1.1 java中int数据占几个字节 1.2 有了基本类型, 为什么还需要包装类型? 1.3 说一下""和equals方法的区别? 1.4 讲一下String和StringBuilder的区别(final)&#xff1f;StringBuffer和StringBuilder的区别? 1.5, 讲一下java中的集合? 1.6 Ar…...

360度搜索建站网/网站推广公司排名

今天弄了一上午的python-ldap,发现要么安装vc&#xff0c;要么用其他比较麻烦的方法&#xff0c;都比较麻烦。幸好找到这个地址&#xff1a; http://www.lfd.uci.edu/~gohlke/pythonlibs/ http://www.voidspace.org.uk/python/modules.shtml 这上面有很多python第三方包的二进制…...