[嵌入式 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 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

python修改字符串值的三种方法

《python修改字符串值的三种方法》本文主要介绍了python修改字符串值的三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录第一种方法:第二种方法:第三种方法:在python中,字符串对象是不可变类型,所以我们没办法直接

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

C#中字符串分割的多种方式

《C#中字符串分割的多种方式》在C#编程语言中,字符串处理是日常开发中不可或缺的一部分,字符串分割是处理文本数据时常用的操作,它允许我们将一个长字符串分解成多个子字符串,本文给大家介绍了C#中字符串分... 目录1. 使用 string.Split2. 使用正则表达式 (Regex.Split)3. 使用

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字