C语言 strtok字符串分割函数详解

这篇具有很好参考价值的文章主要介绍了C语言 strtok字符串分割函数详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

strtok 函数的作用是比较独特的,可以用来对字符串进行分割,对于我们获取命令或者数据集合后的数据处理是不可或缺的一步。但是详细介绍 strtok 的博文很少,而且linux手册的介绍也比较简单,这边写篇博文记录一下学习到的这个函数的用法。


一、strtok函数是什么?

函数定义如下:

strtok()函数,将字符串分解为一组字符串
声明:
char *strtok(char *str, const char *delim);


头文件:#include <string.h>
参数:  

	str:      源字符串指针,即分割之前的字符串  
	delim:    用于分割的字符串指针,即分割符号。如:空格" "、 逗号","、 字符集合"@."等   
	
返回值:  
	成功:返回指向被分割出片段的指针  
	NULL:没有可被分割的字符串

即从字符串 str 中查找标记 delim 中出现的字符并以此切割字符串。注意原字符串 str 在函数调用完成后也会发生变化,变成分割后的第一个字符串。因此不能向第一个参数传递字符串常量,错误写法: char * str = "gonna be a string",应写成:char str[] = "gonna be a string"

二、字符串分割的步骤

在使用 strtok 函数时,第一次调用需要给定 str 参数的值,往后的每一次调用只需将 str 参数设置为 NULL 即可。我们通常使用 while 循环自动分割字符串的所有字符

  • 第一个参数不是 NULL 时,strtok 函数查找 str 下一个标记,以 \0 结尾,strtok 函数会保存标记的地址。
  • 第一个参数为 NULl 时,strtok 函数取上次分割字符串后剩余的字符串继续进行分解操作,如果没有更多的标记则返回 NULL

来举个例子:

#include <stdlib.h>
#include "stdio.h"
#include "string.h"
int main() {
        char *temp = NULL;
        char input[128] = "#10?-ssid=test&-passwd=12345678&-netmask=255.255.255.0&-gateway=192.168.1.1";
        //char *input = (char *)malloc(128); 
        //scanf("%s",input);
        printf("%s\n",input); 
        temp = strtok(input,"?&");
        printf("input=%s,temp=%s\n", input, temp);

        while(temp != NULL){
                temp = strtok(NULL,"?&");
                printf("input=%s,temp=%s\n", input, temp);
        };
        return 0;
}

输出结果:

#10?-ssid=test&-passwd=12345678&-netmask=255.255.255.0&-gateway=192.168.1.1
input=#10,temp=#10
input=#10,temp=-ssid=test
input=#10,temp=-passwd=12345678
input=#10,temp=-netmask=255.255.255.0
input=#10,temp=-gateway=192.168.1.1
input=#10,temp=(null)

可以看到,我们传入的字符串以参数 delim 为依据对字符串进行了切割,其实就是把字符串 str 在参数 delim 中出现的字符替换成了 \0,并且返回标记字符串的首地址,了解到这一点,那么就可以使用 strtok(NULL,' '); 对字符串进行分离输出了。我们把该字符串分割的情况用图像展示出来,可以看到分割的依据是参数 delim 中的 每一个字符
strtok,c语言,linux
所以在第一次分割后,str 的值会变成 #10 ,而后续的字符串需要我们用循环 strtok(NULL," "); 直至值为 NULL 来依照顺序把字符串提取出来。

char *
strtok (char *s, const char *delim)
{
        static char *olds;
        return __strtok_r (s, delim, &olds);
}

char *
__strtok_r (char *s, const char *delim, char **save_ptr)
{
        char *end;

        if (s == NULL)
                s = *save_ptr;
        //...
}

通过源码可以看到,其实 strtok 函数是把分割后剩余的字符串存储在了静态变量中,当函数的第一个参数传入 NULL 时再提取出来进行分解。因为 static 静态变量是全局变量,这种方式在多线程操作时或发生中断的情况下容易引起冲突,所以Linux中可以使用更加安全的 strtok_r 函数进行替换。

三、替代方案:strtok_r函数

strtok 函数是一个线程不安全的函数,多线程时,linux下可以用 strtok_r 函数代替,该函数与 strtok 相似,主要是多了第三个参数 saveptr

函数定义如下:

strtok_r()函数,将字符串分解为一组字符串,同时保证线程安全
声明:
char *strtok_r(char *str, const char *delim, char **saveptr);

头文件:#include <string.h>
参数:  

	str:      源字符串指针,即分割之前的字符串  
	delim:    用于分割的字符串指针,即分割符号。如:空格" "、 逗号","、 字符集合"@."等   
	saveptr:  保存分割后剩余的字符串
	
返回值:  
	成功:返回指向被分割出片段的指针  
	NULL:没有可被分割的字符串

该函数的第三个参数 saveptr 使用用户传入的指针重新申请变量来保存剩余的字符串,更好的保存了切分时的上下文,因此该函数就能被中断而不担心会丢失数据,并且变量保存在每个函数自己的栈,因此可以同时运行该函数的多个副本,在并行环境中保证了安全性。文章来源地址https://www.toymoban.com/news/detail-656501.html

到了这里,关于C语言 strtok字符串分割函数详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python 中的字符串分割函数 split() 详解

    更多Python学习内容:ipengtao.com 在 Python 编程中,处理字符串是一项常见的任务。字符串分割是其中的一个常见操作,而 Python 提供了强大的 split() 函数,用于将字符串拆分成多个部分。本文将详细介绍 split() 函数的用法、参数和示例代码,以帮助大家充分利用这个功能。 spl

    2024年04月27日
    浏览(28)
  • Python split()函数使用详解,Python分割字符串

    「作者主页」: 士别三日wyx 「作者简介」: CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」: 小白零基础《Python入门到精通》 split() 可以按照指定 「分隔符」 对字符串进行 「分割」 。 语法 参数 str :(可选)指定分隔符,默认为空字

    2024年02月12日
    浏览(32)
  • C语言sscanf,strstr和strtok函数用于字符提取分割

    sscanf函数(提取字符): 从输入字符串的左边开始往右匹配,遇到不符合匹配规则时则结束匹配。注意是遇到不符合描述规则时就结束,而不是从整个字符串中提取出符合规则的部分。 字符串格式描述说明: 代码示例: \\\"%04d%02d%02d\\\"是用来解析字符串的格式,%表示格式转换的

    2024年01月16日
    浏览(30)
  • C语言字符函数和字符串函数详解

           Hello, 大家好,我是一代,今天给大家带来有关字符函数和字符串函数的有关知识        所属专栏:C语言        创作不易,望得到各位佬们的互三呦 在C语言中有一些函数是专门为字符设计的,这些函数的使用都需要包含一个头文件ctype.h 如:(注:以下函数原型都

    2024年03月20日
    浏览(41)
  • C语言——详解字符函数和字符串函数(二)

    Hi,铁子们好呀!之前博主给大家简单地介绍了部分 字符和字符串函数 ,那么这次,博主将会把这些字符串函数给大家依次讲完! 今天讲的具体内容如下: 6.1.1 strcmp 函数介绍 它的函数原型如下: 具体的函数介绍如下图所示: 从图中我们得知: - 如果第一个字符串 PTR1 大于

    2024年04月10日
    浏览(39)
  • C语言——详解字符函数和字符串函数(一)

    Hi,铁子们好呀!今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下: 前言: 在编程的过程中,我们经常要处理字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就学习一下这些函数。 众所周知,C语言中提供了一系列的字符函数,这些

    2024年03月17日
    浏览(40)
  • 【进阶C语言】字符函数和字符串函数(万文详解)

    前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。 字符串常量适用于那些对它不做修改的字符串函数. 今天将带来C语言函数的使用介绍 分为三部分供大家理解 如果这份博客对大家有帮助,希望

    2024年01月18日
    浏览(52)
  • 字符串函数(C语言详解)

    字符串是一串连续的且以\\0结尾的字符 注意: 1.以第一种形式初始化字符串时,计算机会自动在字符串末尾加上\\0,所以在给数组申请内存空间时,需要多申请一个字节的内存来存放\\0 2.第二种形式是 常量字符串 ,是 不可以被修改 的 3.第三种形式是字符数组,末尾没有\\0,输

    2024年03月17日
    浏览(33)
  • C语言——详解字符函数和字符串数组(上)

    目录 一、strlen的使用和模拟实现 1.strlen()函数的介绍 2.strlen()函数的具体使用 3.strlen函数的注意事项 4.strlen函数的模拟实现 二、strcpy的使用和模拟实现 1.strcpy()函数的介绍 2.strcpy()函数的具体使用 3.strcpy()函数的注意事项 4.strcpy函数的模拟实现 三、strcat 的使用和模拟实现  1

    2024年01月16日
    浏览(38)
  • 【C语言】strcpy()函数(字符串拷贝函数详解)

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录  一.strcpy()函数简介 1.函数功能 2.函数参数 1.char * destination 2.const char * source 3.函数返回值 4.函数头文件 二.strcpy()函数的具体使用 1.使用strcpy()函数完成字符数组间的字符拷贝 2.使用strcpy()函数完成

    2024年02月03日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包