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

38 C 语言字符串搜索与分割函数详解:strchr、strrchr、strpbrk、strstr、strcspn、strtok

1 strchr() 函数

1.1 函数原型

#include <string.h>  // 必须包含此头文件才能使用 strchr() 函数char *strchr(const char *s, int c);

1.2 功能说明

        strchr() 函数用于在字符串 s 中从前往后查找字符 c(包括终止符 \0)第一次出现的位置,并返回指向该字符的指针

  • 参数:
    • s:指向以 \0 结尾的字符串的指针
    • c:要查找的字符(传入时为 int 类型,函数内部会转换为 unsigned char 处理)
  • 返回值:
    • 如果找到字符 c,则返回一个指向该字符的指针(类型为 char*)
    • 如果未找到,则返回 NULL
    • 特别地,如果查找的是 \0,则函数将返回指向字符串结尾的指针
  • 工作原理:
    • 函数从字符串 s 的起始位置开始查找;逐个字节比较当前字符是否等于 c
    • 包括字符串结束符 \0 在内也会参与比较
    • 一旦发现匹配字符,立即返回从这个字符开始到字符串末尾的部分
    • 如果整个字符串中都没有匹配字符,则返回 NULL

1.3 注意事项

  • 区分大小写:查找 'A' 和 'a' 被视为不同字符
  • 按字节查找,不处理多字节字符:strchr() 只识别单字节字符,无法正确识别 UTF-8、GBK 等多字节字符中的 “整体字符”
  • 允许查找 '\0':strchr(s, '\0') 返回指向字符串末尾的指针
  • 传入 NULL 是未定义行为:如果 s 为 NULL,程序行为不可预测,可能导致崩溃
  • 返回的指针可读但不应修改常量字符串内容:若原字符串是常量或只读内存,修改会导致未定义行为

1.4 应用场景

  • 判断字符是否存在:快速判断某字符是否出现在字符串中。
  • 用户输入处理:例如判断邮箱中是否包含 '@' 符号。
  • 日志/协议解析:查找特定标记字符(如冒号 :、逗号 ,、换行符 \n)进行数据提取。
  • 查找分隔符:如解析路径时查找 '/' 或 '\\',提取文件名或目录。
  • 字符串拆分辅助:配合 strncpy()、memcpy() 实现基于分隔符的字符串分割。

1.5 示例程序

#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strchr() 函数int main()
{char str[] = "hello world"; // 定义一个字符数组作为字符串char *result;               // 指针变量,记录找到的位置// 查找字符 'w' 在字符串中的位置result = strchr(str, 'w');// 判断是否找到,并输出结果if (result != NULL){// result - str 是两个指针之间的差值,表示索引位置printf("第一个匹配字符是 '%c',出现在第 %lld 个位置\n", *result, result - str); // 6printf("从该字符开始的子字符串是:%s\n", result);                               // world}else{printf("字符 'w' 未找到。\n");}// 查找字符 'z'result = strchr(str, 'z');if (result == NULL){printf("字符 'z' 未找到。\n");}// 查找字符串结束符 '\0'result = strchr(str, '\0');if (result != NULL){printf("字符串结束符 '\\0' 出现在第 %lld 个位置\n", result - str); // 11(结束符的位置)}return 0;
}

        程序在 VS Code 中的运行结果如下所示:


2 strrchr() 函数

2.1 函数原型

#include <string.h>  // 必须包含此头文件才能使用 strrchr() 函数char *strrchr(const char *s, int c);

2.2 功能说明

        strrchr() 函数用于在字符串 s 中从前往后查找字符 c(包括终止符 \0)最后一次出现的位置,并返回指向该字符的指针

  • 参数:
    • s:指向以 \0 结尾的字符串的指针
    • c:要查找的字符(传入时为 int 类型,函数内部会转换为 unsigned char 处理)
  • 返回值:
    • 如果找到字符 c,则返回一个指向该字符的指针(类型为 char*)
    • 如果未找到,则返回 NULL
    • 特别地,如果查找的是 \0,则函数将返回指向字符串结尾的指针
  • 工作原理:
    • 函数从字符串 s 的起始位置开始查找
    • 逐个字节比较当前字符是否等于 c
    • 每次匹配成功都记录最新位置
    • 遍历完整个字符串后,返回最后一个匹配字符的地址
    • 如果遍历结束仍未找到匹配字符,则返回 NULL
    • 注意:包括字符串结束符 \0 在内也会参与比较

2.3 注意事项

  • 区分大小写:例如 'A' 和 'a' 被视为不同字符
  • 按字节查找:只识别单字节字符,不能正确处理 UTF-8、GBK 等多字节字符中的 “整体字符”
  • 允许查找 '\0'可用于获取字符串末尾的地址
  • 传入 NULL 是未定义行为:如果 s 为 NULL,程序行为不可预测,可能导致崩溃
  • 返回的指针可读但不应修改常量字符串内容:若原字符串是常量或位于只读内存中,修改会导致未定义行为

2.4 应用场景

  • 提取路径中的文件名:如解析 "C:/dir/file.txt",查找最后一个 '/' 或 '\\'。
  • 字符串截取操作:定位特定字符后提取其后的子串。
  • 日志/协议解析:如查找最后出现的冒号 : 提取配置项值。
  • 判断字符是否存在:快速检测某字符是否出现在字符串中,且需要最后一次出现的位置。
  • 文件扩展名提取:查找最后一个 '.' 字符来分离主文件名与扩展名。

2.5 示例程序

#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strrchr() 函数int main()
{char path[] = "/home/user/documents/report.txt"; // 假设这是一个文件路径char *result;                                    // 指针变量,记录找到的位置// 查找最后一个 '/',用于提取文件名result = strrchr(path, '/');if (result != NULL){// result - path 指针相减得到字符在字符串中的位置printf("最后一个 '/' 出现在第 %lld 个位置\n", result - path); // 20// result + 1 跳过 '/',指向文件名部分printf("文件名是:%s\n", result + 1); // report.txt}else{printf("未找到字符 '/'。\n");}// 查找字符 't'result = strrchr(path, 't');if (result != NULL){printf("最后一个 't' 出现在第 %lld 个位置\n", result - path); // 30}// 查找不存在的字符 'z'result = strrchr(path, 'z');if (result == NULL){printf("字符 'z' 未找到。\n");}// 查找字符串结束符 '\0'result = strrchr(path, '\0');if (result != NULL){printf("字符串结束符 '\\0' 出现在第 %lld 个位置\n", result - path); // 31}return 0;
}

        程序在 VS Code 中的运行结果如下所示:


3 strpbrk() 函数

3.1 函数原型

#include <string.h>  // 必须包含此头文件才能使用 strpbrk() 函数char *strpbrk(const char *s1, const char *s2);

3.2 功能说明

        strpbrk() 函数用于在字符串 s1 中查找第一个出现在字符串 s2 中的任意一个字符,并返回指向该字符的指针

  • 参数:
    • s1:指向以 \0 结尾的目标字符串的指针,函数将在此字符串中进行查找
    • s2:指向以 \0 结尾的字符集合字符串的指针,表示要查找的字符集合
  • 返回值:
    • 如果找到匹配字符,则返回一个指向该字符的指针(类型为 char*)
    • 如果未找到任何匹配字符,则返回 NULL
  • 工作原理:
    • 函数首先遍历字符串 s2,构建一个字符查找表(例如使用数组记录每个字符是否出现)
    • 然后从字符串 s1 的起始位置开始逐个字符比较
    • 对于 s1 中的每一个字符,检查它是否存在于 s2 的字符集合中
    • 一旦发现某个字符存在于 s2 中,函数立即返回指向该字符的指针
    • 若整个 s1 都扫描完毕仍未找到匹配字符,则返回 NULL
    • 注意:不会查找 s2 中的终止符 \0,即不把 \0 当作有效字符参与匹配判断

3.3 注意事项

  • 区分大小写:例如 'A' 和 'a' 被视为不同字符
  • 按字节查找:与 strchr() 一样,strpbrk() 只识别单字节字符,不能正确处理 UTF-8、GBK 等多字节字符中的 “整体字符”
  • 不包括终止符 '\0':函数不会将 s2 中的 '\0' 视为有效字符参与比较
  • 传入 NULL 是未定义行为:如果 s1 或 s2 为 NULL,程序行为不可预测,可能导致崩溃
  • 返回的指针可读但不应修改常量字符串内容:如果原字符串是常量或位于只读内存中,修改会导致未定义行为

3.4 应用场景

  • 验证输入格式:如检查用户名中是否含有非法字符。
  • 协议解析:查找分隔符集合中的任意一个,如解析 HTTP 请求行时查找空格、冒号等。
  • 提取关键字或特殊符号:如在日志中查找特定操作符。
  • 路径/URL 解析:查找路径中的多种分隔符(如 /,\,:)。
  • 密码强度校验:判断密码中是否包含特殊字符。

3.5 示例程序

#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strpbrk() 函数int main()
{char str[] = "user:password@domain.com"; // 假设这是一个 URL 或连接字符串char *result;                            // 指针变量,记录找到的位置// 查找第一个出现的特殊字符(如 :  @  .)result = strpbrk(str, ":@.");if (result != NULL){// result - str 计算匹配字符在字符串中的位置printf("第一个匹配字符是 '%c',出现在第 %lld 个位置\n", *result, result - str); // 4printf("从该字符开始的子字符串是:%s\n", result);}else{printf("未找到指定的任何字符。\n");}// 再测试一个找不到的情况result = strpbrk(str, "#$!");if (result == NULL){printf("未找到 '#', '$' 或 '!' 中的任何字符。\n");}return 0;
}

        程序在 VS Code 中的运行结果如下所示:


4 strstr() 函数

4.1 函数原型

#include <string.h>  // 必须包含此头文件才能使用 strstr() 函数char *strstr(const char *haystack, const char *needle);

4.2 功能说明

        strstr() 函数用于在字符串 haystack 中查找第一次出现子字符串 needle 的位置,并返回指向该位置的指针

  • 参数:
    • haystack:指向以 \0 结尾的目标字符串的指针,表示要在其中进行搜索的大字符串
    • needle:指向以 \0 结尾的子字符串的指针,表示要查找的内容
  • 返回值:
    • 如果找到子串 needle,则返回一个指向 haystack 中第一次出现 needle 的起始位置的指针(类型为 char*)
    • 如果未找到匹配的子串,则返回 NULL
    • 如果 needle 是空字符串 "",根据 C99 及以后的标准,函数通常返回 haystack 本身(即起始地址)
    • 如果 needle 长度大于 haystack,则直接返回 NULL
  • 工作原理:
    • 函数首先检查 needle 是否为空字符串 "",如果是,通常直接返回 haystack 本身(即起始地址)
    • 然后检查 needle 的长度是否大于 haystack,如果是,则直接返回 NULL
    • 接下来,函数从 haystack 的第一个字符开始,尝试与 needle 进行逐字符匹配
    • 每次匹配失败后,将 haystack 的当前匹配位置向后移动一位,重新尝试匹配 needle
    • 一旦发现连续字符完全匹配 needle 中的所有字符(包括最后的 \0),则立即返回当前 haystack 的指针位置
    • 若遍历完整个 haystack 都没有找到匹配的子串,则返回 NULL
    • 注意:只比较字节内容,不处理多字节字符(如 UTF-8 编码中的汉字等)

4.3 注意事项

  • 区分大小写:例如 'A' 和 'a' 被视为不同字符
  • 按字节查找:strstr() 只识别单字节字符,不能正确处理 UTF-8、GBK 等多字节字符中的 “整体字符”
  • 空字符串匹配规则:如果 needle 是空字符串 "",根据 C99 标准,函数通常返回 haystack 本身
  • 传入 NULL 是未定义行为:如果 haystack 或 needle 为 NULL,程序行为不可预测,可能导致崩溃
  • 返回的指针可读但不应修改常量字符串内容:若原字符串是常量或位于只读内存中,修改会导致未定义行为

4.4 应用场景

  • 关键词检索:如在文本编辑器中实现 “查找” 功能。
  • 日志分析:判断某条日志是否包含特定关键字或错误信息。
  • 协议解析:在 HTTP 报文中查找 "Content-Type"、"Host" 等字段。
  • URL 处理:查找是否存在 "https://"、"?id=" 等特征子串。
  • 字符串提取:配合 strncpy()、memcpy() 实现基于子串的截取操作。

4.5 示例程序

#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strstr() 函数int main()
{char haystack[] = "The quick brown fox jumps over the lazy dog.";char *result;// 查找子字符串 "fox",返回指针指向子字符串在主字符串中的位置result = strstr(haystack, "fox");if (result != NULL){printf("子字符串 \"fox\" 出现在第 %lld 个位置\n", result - haystack); // 16printf("从该位置开始的子字符串是:%s\n", result);                     // fox jumps over the lazy dog.}else{printf("子字符串 \"fox\" 未找到。\n");}// 查找不存在的子字符,返回 NULLresult = strstr(haystack, "cat");if (result == NULL){printf("子字符串 \"cat\" 未找到。\n");}// 查找空字符串(在大多数实现中会返回 haystack)result = strstr(haystack, "");if (result != NULL){printf("空字符串被匹配到,返回 haystack 起始地址。\n");printf("结果是(通常返回 haystack 本身):%s\n", result);}// 如果 needle 长度大于 haystack,则直接返回 NULLresult = strstr(haystack, "The quick brown fox jumps over the lazy dog 123456789");if (result == NULL){printf("子字符串长度大于 haystack,返回 NULL。\n");}return 0;
}

        程序在 VS Code 中的运行结果如下所示:


5 strcspn() 函数

5.1 函数原型

#include <string.h>  // 必须包含此头文件才能使用 strcspn() 函数size_t strcspn(const char *s1, const char *s2);

5.2 功能说明

        strcspn() 函数用于计算字符串 s1 中第一个出现在字符串 s2 中的字符的位置索引(即从起始位置开始到该字符前一个位置的字符个数)

  • 参数:
    • s1:指向以 \0 结尾的目标字符串的指针,表示要被扫描的字符串
    • s2:指向以 \0 结尾的字符集合字符串的指针,表示要排除的字符集合
  • 返回值:
    • 返回 s1 中第一个出现在 s2 中的字符前面的所有字符的数量(类型为 size_t)
    • 如果 s1 中没有任何字符出现在 s2 中,则返回整个字符串 s1 的长度(即直到 \0 的所有字符数)
    • 特别地,如果 s2 是空字符串 "",则函数返回的是 s1 的总长度
  • 工作原理:
    • 函数首先遍历字符串 s2,构建一个字符查找表(例如使用数组记录每个字符是否出现)
    • 然后从字符串 s1 的起始位置开始逐个字符检查
    • 对于 s1 中的每一个字符,检查它是否存在于 s2 的字符集合中
    • 一旦发现某个字符存在于 s2 中,立即停止扫描,并返回从 s1 开始到当前字符前一个位置的字符个数
    • 若整个 s1 都扫描完毕仍未找到匹配字符(即没有字符属于 s2),则返回 s1 的长度
    • 注意:不会查找 s2 中的终止符 \0,即不把 \0 当作有效字符参与匹配判断

5.3 注意事项

  • 区分大小写:例如 'A' 和 'a' 被视为不同字符
  • 按字节查找:只识别单字节字符,不能正确处理 UTF-8、GBK 等多字节字符中的 “整体字符”
  • 不包括终止符 '\0':函数不会将 s2 中的 \0 视为有效字符参与比较
  • 传入 NULL 是未定义行为:如果 s1 或 s2 为 NULL,程序行为不可预测,可能导致崩溃
  • 返回值是字符数量而非指针:不同于 strchr()、strstr() 等函数,strcspn() 返回的是整型数值,代表偏移量

5.4 应用场景

  • 提取字符串头部合法字符:如从输入中提取数字、字母等特定字符序列。
  • 协议解析:提取 URL 中主机名、路径等信息时跳过非法字符。
  • 日志分析:提取日志行首的时间戳或标识字段。
  • 密码校验:验证密码中是否含有非法字符。
  • 字符串分割辅助:配合 memcpy()、strncpy() 实现基于字符集合的字符串切分。

5.5 示例程序

#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strcspn() 函数int main()
{char s1[] = "user_name@example.com";char s2[] = "@!"; // 查找这些特殊字符首次出现的位置前有多少合法字符size_t len;// 查找 '@' 前面有多少字符len = strcspn(s1, s2);printf("在字符串 \"%s\" 中,前 %zu 个字符不属于 \"%s\"\n", s1, len, s2);// 再测试一个找不到的情况len = strcspn("hello123", "#$%");printf("字符串 \"hello123\" 中前 %zu 个字符不属于 \"#$%%\"\n", len); // 输出 8 (hello123 的长度)// 测试 s2 为空字符串len = strcspn("abc123", "");printf("当 s2 为空字符串时,返回字符串长度:%zu\n", len); // 输出 6 (abc123 的长度)return 0;
}

        程序在 VS Code 中的运行结果如下所示:


6 strtok() 函数

6.1 函数原型

#include <string.h>  // 必须包含此头文件才能使用 strtok() 函数char *strtok(char *str, const char *delim);

6.2 功能说明

        strtok() 函数用于将字符串 str 按照分隔符字符串 delim 中的任意一个字符进行分割,并依次返回各个子字符串(即 “token”)

  • 参数:
    • str:指向要被分割的字符串的指针。首次调用时传入原始字符串,后续调用传入 NULL 以继续解析原字符串
    • delim:指向以 \0 结尾的分隔符字符串的指针,表示用于分割的字符集合
  • 返回值:
    • 如果成功找到下一个 token,则返回指向该子字符串的指针(类型为 char*)
    • 如果没有更多 token 可提取(即字符串已解析完毕),则返回 NULL
    • 特别地,如果 str 是空指针且内部状态中无剩余 token,也返回 NULL
  • 工作原理:
    • 第一次调用时,传入原始字符串 str,函数会跳过开头所有属于 delim 的字符
    • 然后从第一个非分隔符字符开始作为 token 的起始位置
    • 继续向后查找,直到遇到任意一个属于 delim 的字符或字符串结束符 \0
    • 遇到分隔符时,将其替换为 \0,并记录当前位置以便下一次继续解析
    • 后续调用时传入 NULL,函数会从上一次结束的位置继续查找下一个 token
    • 整个过程中,strtok() 会修改原始字符串,在每个 token 结尾插入 \0
    • 注意:不会查找 delim 中的终止符 \0,即不把 \0 当作有效分隔符参与匹配判断

6.3 注意事项

  • 破坏原始字符串:strtok() 会在分隔符处插入 \0,因此不能对常量字符串(如 "hello,world")使用,否则会导致未定义行为
  • 不是线程安全的:该函数使用了静态变量保存解析状态,多线程环境下应使用其线程安全版本 strtok_r() 或 strtok_s()
  • 区分大小写:例如 'A' 和 'a' 被视为不同字符
  • 按字节查找:只识别单字节字符,不能正确处理 UTF-8、GBK 等多字节字符中的 “整体字符”
  • 传入 NULL 是合法行为:在第一次调用后,后续调用应传入 NULL 来继续解析
  • 多个连续分隔符被视为一个分隔符:即不会返回空 token

6.4 应用场景

  • 字符串拆分:如将逗号分隔的列表拆分为多个字段。
  • 命令行参数解析:如解析用户输入的命令和参数。
  • 日志分析:将日志行按空格、制表符等分隔符提取各部分信息。
  • 配置文件读取:如解析 .ini 文件中的键值对。
  • CSV/TSV 数据解析:将每一行数据按逗号或制表符分割成列。

6.5 示例程序

#include <stdio.h>
#include <string.h> // 必须包含此头文件才能使用 strtok() 函数int main()
{char str[] = "apple, banana; orange\tgrape"; // 带多种分隔符的字符串const char *delim = ",; \t";                 // 分隔符包括逗号、分号、空格和制表符char *token;printf("原始字符串: \"%s\"\n", str);// 第一次调用,传入原始字符串token = strtok(str, delim);int i = 1;while (token != NULL){printf("第 %d 个 token: \"%s\"\n", i++, token);// 后续调用传入 NULL,继续解析原字符串token = strtok(NULL, delim);}return 0;
}

        程序在 VS Code 中的运行结果如下所示:


7 字符串搜索与分割函数总结

函数名功能说明参数返回值安全性
strchr在字符串 s 中从前往后查找字符 c(包括终止符 \0)第一次出现的位置,并返回从该位置开始的子字符串。

const char *s(指向以 \0 结尾的字符串的指针),

int c(要查找的字符,内部转为 unsigned char 处理)

如果找到字符 c,则返回一个指向该字符的指针(类型为 char*);

如果未找到,则返回 NULL。

特别地,若查找的是 \0,则返回指向字符串结尾的指针。

安全(不修改原始字符串)
strpbrk在字符串 s1 中查找第一个出现在字符串 s2 中的任意一个字符,并返回指向该字符的指针。

const char *s1(目标字符串),

const char *s2(包含待查找字符的字符串)

如果找到匹配字符,返回指向该字符的指针(类型为 char*);

如果未找到任何匹配字符,返回 NULL。

安全(不修改原始字符串)
strstr在字符串 haystack 中查找第一次出现子字符串 needle 的位置,并返回指向该位置的指针。

const char *haystack(目标大字符串),

const char *needle(要查找的子字符串)

如果找到子串 needle,返回指向首次出现位置的指针;

如果未找到或 needle 为空字符串(""),根据 C99 标准返回 haystack;

若 needle 长度大于 haystack,返回 NULL。

安全(不修改原始字符串)
strcspn计算字符串 s1 中从起始位置开始到第一个出现在 s2 中的字符前的字符数(即连续不在 s2 中的字符个数)。

const char *s1(目标字符串),

const char *s2(包含排除字符的字符串)

返回 s1 中第一个出现在 s2 中的字符前面的字符数量(类型为 size_t);

如果 s1 中没有字符属于 s2,则返回整个字符串长度;

如果 s2 是空字符串,也返回整个字符串长度。

安全(不修改原始字符串)
strtok将字符串 str 按照分隔符字符串 delim 进行分割,依次返回各个子字符串(token)。首次调用传入字符串,后续传入 NULL。

char *str(要被分割的字符串,首次调用时传入,后续为 NULL),

const char *delim(分隔符集合)

成功时返回指向当前 token 的指针;

无更多 token 或解析结束时返回 NULL。

不安全(会修改原始字符串内容;非线程安全)

其他类似但非标准 C 库的函数:

  • index:类似于 strchr,用于查找字符第一次出现的位置,属于旧版 BSD 接口,不推荐在新代码中使用。
  • rindex:类似于 strrchr,用于查找字符最后一次出现的位置,也是旧版 BSD 接口,建议使用 strrchr 替代。
  • strcasestr:strstr 的不区分大小写版本,用于查找子字符串时忽略大小写差异,常见于 GNU/Linux 系统中。
  • strsep:一个线程安全、可重入的字符串分割函数,用于从字符串中提取字段,支持灵活的分隔符处理,虽然不是 ISO C 标准的一部分,但在 BSD 和 Linux 系统中常用。
http://www.xdnf.cn/news/13461.html

相关文章:

  • 现代汽车在巴黎和得克萨斯州宣传其混合动力汽车为「两全其美之选」
  • CppCon 2015 学习:Extreme Type Safety with Opaque Typedefs
  • 从走线到互连:优化高速信号路径设计的快速指南
  • vue 监听页面滚动
  • carla与ros坐标变换
  • iOS 抖音首页头部滑动标签的实现
  • 【DAY45】 Tensorboard使用介绍
  • 《高等数学》(同济大学·第7版)第三章第五节“函数的极值与最大值最小值“
  • github.com 链接127.0.0.1
  • 征程 6E/M|如何解决量化部署时 mul 与 bool 类型数据交互的问题
  • 《为什么 String 是 final 的?Java 字符串池机制全面解析》
  • MySql简述
  • 基于GeoTools求解GeoTIFF的最大最小值方法
  • 搞了两天的win7批处理脚本问题
  • SaaS(软件即服务)和 PaaS(平台即服务)的定义及区别(服务对象不同、管理责任边界、典型应用场景)
  • GO自带日志库log包解释
  • 【二】12.关于中断
  • APM32芯得 EP.10 | 基于APM32F411控制的一个软开关电路设计分享
  • yolo格式分割标签可视化,coco-seg数据集
  • 6个月Python学习计划 Day 19 - 模块与包的实战拆分
  • 【Java】在 Spring Boot 中集成 Spring Security + JWT 实现基于 Token 的身份认证
  • 使用Spring Boot Actuator构建用户应用
  • 发布一个angular的npm包(包含多个模块)
  • Nuclei PoC 编写详解:从入门到实践
  • PostgreSQL 数据库技术峰会重庆站回顾|IvorySQL 开源实践与社区生态
  • python打卡day50
  • Leetcode 3572. Maximize Y‑Sum by Picking a Triplet of Distinct X‑Values
  • 对3D对象进行形变分析
  • 基于“SpringBoot+uniapp的考研书库微信小程序设计与实现7000字论文
  • 新型DuplexSpy RAT可使攻击者完全控制Windows系统