有的,它就是strtok_r。 Linux下的strtok_r函数 描述 strtok_r是linux平台下的strtok函数的线程安全版。windows的string.h中并不包含它。...要想使用这个函数,找到linux下的实现源码,复制到你的程序中即,或者使用GNU C Library。 strtok_r函数是strtok函数的可重入版本。...一系列不同的字符串可能会同时连续调用strtok_r进行提取,要为不同的调用传递不同的saveptr参数。...= strtok_r(NULL, "=", &sp); // x = NULL // s = "abc\0-def\0" */ char *strtok_r(char...strtok_r将原内部指针显示化,提供了saveptr这个参数。增加了函数的灵活性和安全性。
源自百度百科: 下面的说明摘自于Linux内核2.6.29,说明了这个函数已经不再使用,由速度更快的strsep()代替。.../** linux/lib/string.c** Copyright (C) 1991, 1992 Linus Torvalds*//** stupid library routines.....使用strtok_r()完成分割 strtok是一个线程不安全的函数,因为它使用了静态分配的空间来存储被分割的字符串位置,线程安全的函数是strtok_r()。...char *strtok_r(char *str, const char *delim, char **saveptr); strtok_r函数是strtok函数的可重入版本。...一系列不同的字符串可能会同时连续调用strtok_r进行提取,要为不同的调用传递不同的saveptr参数。
七、差异对比:strtok () vs strtok_r () vs strsep () 实际开发中,除了strtok(),strtok_r()和strsep()也是常用的分割函数。...char*, const char*, char**) char* strsep(char**, const char*) 兼容性 所有 C 编译器支持(C89+) 主流编译器支持(C99+) BSD、Linux...)开发,选strtok_r();仅 Linux/BSD 环境,可按需选strsep()。...注意:strsep()是 BSD 扩展函数,非 C 标准,移植性(如 Windows)不如strtok()的标准替代strtok_r()。...博主简介 byte轻骑兵,现就职于国内知名科技企业,专注于嵌入式系统研发,深耕 Android、Linux、RTOS、通信协议、AIoT、物联网及 C/C++ 等领域。
或并行分割多个字符串; 行为兼容:默认保留与strtok()一致的分隔符处理逻辑(跳过连续分隔符),降低迁移成本; 平台局限:本质是微软扩展,仅在 Windows 平台(MSVC、MinGW-w64)支持,Linux.../macOS 等类 Unix 系统需用strtok_r()(C 标准可重入版)替代。.../macOS):strtok_s()是微软扩展,类 Unix 系统不支持,需用strtok_r()替代(可通过条件编译兼容:#ifdef _WIN32 使用strtok_s #else 使用strtok_r...平台兼容性:仅 Windows 支持,跨平台需兼容处理 strtok_s()是微软特有扩展,Linux/macOS 下编译会报错。...(Windows)和__linux__/__APPLE__(类 Unix)区分平台; 选择替代函数:类 Unix 系统用 C 标准可重入版strtok_r()(与 strtok_s () 功能类似,均通过用户指针保存状态
6、strtok_r函数 strtok_s函数是linux下分割字符串的安全函数,函数声明如下: char *strtok_r(char *str, const char *delim, char...char *p; printf("before strtok: str=%s\n",str); printf("begin:\n"); ptr = strtok_r...= NULL){ printf("str=%s\n",str); printf("ptr=%s\n",ptr); ptr = strtok_r
通过一个实际小应用,记录C语言中4个字符串操作相关的函数及其用法: strtok_r strstr strtok atoi 问题引出 先贴一段变量定义: char str[] = "led,100,0,80,15...函数介绍与示例 strtok_r 首先需要将字符串切分为指令和参数形式,需要用到strtok_r函数。...函数定义: char *strtok_r(char * __restrict__ _Str, const char * __restrict__ _Delim, char ** __restrict__...================================== /* char *strtok_r(char * __restrict__ _Str, const char * _...] --------------------->\r\n"); cmd = strtok_r(str, ",", ¶s); printf("cmd:%s\r\n", cmd);/
\n", tok); tok = strtok(0, s); } return (0); } 输出 juejin for juejin Contribute 使用strtok_r...() 就像 C 中的 strtok() 函数一样,strtok_r() 执行相同的任务,将字符串解析为标记序列。...strtok_r() 是 strtok() 的可重入版本。...我们可以通过两种方式调用 strtok_r() // 第三个参数 saveptr 是一个指向 char * 变量的指针,strtok_r() 在内部使用该变量, // 以便在解析相同字符串的连续调用之间维护上下文...char *strtok_r(char *str, const char *delim, char **saveptr); 下面是一个简单的 C++ 程序来展示 strtok_r() 的使用: #include
s\n", tok); tok = strtok(0, s); } return (0); } 输出 juejin for juejin Contribute 使用strtok_r...() 就像 C 中的 strtok() 函数一样,strtok_r() 执行相同的任务,将字符串解析为标记序列。...strtok_r() 是 strtok() 的可重入版本。...我们可以通过两种方式调用 strtok_r() 下面是一个简单的 C++ 程序来展示 strtok_r() 的使用: #include #include int...){ char str[] = "juejin for juejin"; char *token; char *rest = str; while ((token = strtok_r
= 0;i < 4; i++) { if (0 == i) { q = strtok_r...devName,q); } if (1 == i) { q = strtok_r...dirName,q); } if (2 == i) { q = strtok_r...fsType,q); } if (3 == i) { q = strtok_r
以及C语言中的strtok_r()。...snprintf(buf, sizeof(buf), "%s", str.c_str()); if (ret < 0) { return; } char* token = strtok_r...= NULL) { vec.emplace_back(token); token = strtok_r(NULL, del, &save); } } 使用benchmark
TCP 层 TCP 层我们是基于 libuv 进行开发, libuv 是一个异步 I/O 库,并且支持了多个平台( Linux ,Windows 和 Darwin ),一开始主要应用于开发 Node.js...dul_node_t *pre_loader) { char *p = loader; char *inner_ptr = NULL; /* params 提取组装 */ p = strtok_r...string 解析 */ void params_parser(char *query, map_t params) { char *outer_ptr = NULL; char *p = strtok_r...(query, "&", &outer_ptr); while (p) { char *inner_ptr = NULL; char *key = strtok_r...(p, "=", &inner_ptr); hashmap_put(params, key, inner_ptr); p = strtok_r(NULL, "&", &outer_ptr
if (strstr(str, needle)) { for (i = 0; ; str = NULL, i++) { token = strtok_r..."; 因为此时是定义一个指向字符串字面值(位于.rodata段)的指针,而 调用strtok_r函数会修改这个字符串,运行时会产生段错误 */ char url[] = "http...complete=1&hl=zh-CN&ie=GB2312&q=linux&meta="; /* 给url初始化用的这个字符串并没有分配在.rodata段,而是直接写在指令里了, *
层:基于 libuv 实现 TCP 连接和数据的读写 整体架构如下图所示: TCP 层 TCP 层我们是基于 libuv 进行开发, libuv 是一个异步 I/O 库,并且支持了多个平台( Linux...*tokenizer, char *loaders, context *c) { char *outer_ptr = NULL; char *p = strtok_r...(p) { pre_loader = processor_loader(tokenizer, p, pre_loader); p = strtok_r...char *p = loader; char *inner_ptr = NULL; /* params 提取组装 */ p = strtok_r...(p, "=", &inner_ptr); hashmap_put(params, key, inner_ptr); p = strtok_r(NULL,
= NULL); 在多线程程序中应替换为以下代码片段: char *pointer; ... token[0] = strtok_r(string, separators, &pointer); i =...0; do { i++; token[i] = strtok_r(NULL, separators, &pointer); } while (token[i] !
举个例子,strtok是既不可重入的,也不是线程安全的;加锁的strtok不是可重入的,但线程安全;而strtok_r 既是可重入的,也是线程安全的。...参考: 《linux c 编程一站式学习》
这里可以继续对buf进行分析和处理,比如根据buf的不同内容执行不同的小任务 } } } 2.3 一个小应用 结合之前文章介绍的字符串操作的相关知识:C语言字符串相关函数使用示例 strtok_r...//先判断指令名称 char *cmd;//表示命令 char *paras;//表示命令后的参数 cmd = strtok_r((char*)buf, " ", ¶s);//这里有点小问题,不带参数的命令
Linux 文件系统 目录 说明 bin 存放二进制可执行文件 sbin 存放二进制可执行文件,只有 root 才能访问 boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc...是超级管理员 localhost 表示主机名 ~ 表示当前目录(家目录),其中超级管理员家目录为 /root,普通用户家目录为 /home/chan $ 表示普通用户提示符,# 表示超级管理员提示符 Linux...test.tar.gz 文件搜索命令 locate:在后台数据库搜索文件 updatedb:更新后台数据库 whereis:搜索系统命令所在位置 which:搜索命令所在路径及别名 find:搜索文件或文件夹 用户和组 Linux
ARM 提供了可重入版本 _asctime_r()、_localtime_r() 和 _strtok_r()。 ARM 建议您改用这些函数以确保安全。 Note 这些可重入版本使用一些附加参数。..._strtok_r() 使用的附加参数也是一个指针,指向的是指向下一个标记的 char 指针。
Linux文件操作 Linux中,一切皆文件(网络设备除外)。 硬件设备也“是”文件,通过文件来使用设备。 目录(文件夹)也是一种文件。...boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件和镜像文件。...deb:deb是Device(设备)的缩写,该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。...系统会自动识别一些设备,例如U盘、光驱等,当识别后,Linux会把识别的设备挂载到这个目录下。...---- Linux文件的操作方式 文件描述符fd fd是一个大于等于0的整数。 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件。