[嵌入式 C 语言] 字符串处理函数

2024-09-04 10:28

本文主要是介绍[嵌入式 C 语言] 字符串处理函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、字符串分割函数  strtok_r

        strtok_r 是一个用于字符串操作的 C 标准库函数,它的作用是从一个字符串中分割出子字符串。strtok_r 是线程安全的版本,相比于 strtok 更适合在多线程环境中使用,因为它使用额外的参数来跟踪状态,而不是依赖于全局变量。

1.1 函数原型

strtok_r 的原型定义在 <string.h> 头文件中,其定义如下:

char *strtok_r(char *strtok,const char *delim,char **save_ptr
);

1.2 参数说明

  • strtok: 指向要进行分割的字符串。
  • delim: 一个字符串,包含分割符。如果 delim 中有多个字符,那么每个字符都会被视为一个分割符。
  • save_ptr: 一个指向 char * 类型的指针。这个指针用于保存中间状态,使得 strtok_r 可以被多次调用来分割同一个字符串。

1.3 返回值

  • 如果成功找到一个子字符串,strtok_r 返回指向该子字符串的指针。
  • 如果找不到子字符串(即已经分割完整个字符串),strtok_r 返回 NULL

1.4 使用示例

假设有一个字符串 "a,b,c,d,e",我们想按照逗号 , 来分割它:

#include <stdio.h>
#include <string.h>int main() {char str[] = "a,b,c,d,e";char *save_ptr;char *token;// 第一次调用token = strtok_r(str, ",", &save_ptr);while (token != NULL) {printf("%s\n", token);// 后续调用token = strtok_r(NULL, ",", &save_ptr);}return 0;
}

 输出结果将是:

a
b
c
d
e

1.5 工作原理

  1. 当首次调用 strtok_r 时,需要传递字符串的起始地址和分割符以及一个初始化为 NULL 的 save_ptr
  2. strtok_r 会在字符串中查找第一个不在 delim 中的字符,并返回指向该字符的指针。
  3. 在找到第一个不在 delim 中的字符之后,strtok_r 会继续查找下一个在 delim 中的字符,并将这些字符之前的子字符串作为结果返回。
  4. 每次调用 strtok_r 都会更新 save_ptr,使其指向当前处理位置之后的字符。
  5. 当再次调用 strtok_r 时,只需要传递 NULL 作为第一个参数,save_ptr 会记住上次调用的位置,从而继续分割剩余的部分。
  6. 当整个字符串都被分割完毕后,strtok_r 将返回 NULL

1.6 注意事项

  • strtok_r 会修改原字符串,所以在不希望修改原字符串的情况下,应先复制一份再进行分割。
  • 如果在多线程环境中使用 strtok,可能会因为全局状态导致不可预测的结果,因此推荐使用 strtok_r

这篇关于[嵌入式 C 语言] 字符串处理函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135760

相关文章

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Go语言使用Gin处理路由参数和查询参数

《Go语言使用Gin处理路由参数和查询参数》在WebAPI开发中,处理路由参数(PathParameter)和查询参数(QueryParameter)是非常常见的需求,下面我们就来看看Go语言... 目录一、路由参数 vs 查询参数二、Gin 获取路由参数和查询参数三、示例代码四、运行与测试1. 测试编程路

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎