C strtok strtok_s 函数说明 按分隔符分解字符串

2023-11-07

1. 说明

1.1 函数签名如下:

char * strtok ( char * str, const char * delimiters );

1.str : 要被分解成一组小字符串的字符串。
2.delimiters : 包含分隔符的 C 字符串。

1.2 返回值:

该函数返回被分解的一个子字符串,如果没有可检索的字符串,则返回一个空指针。

1.3 使用方法:

第1次调用时,第1个参数要传入1个C的字符串,作为要分割的字符串
后续调用时,第1个参数设置为空指针NULL
上一个被分割的子字符串的位置会被函数内部记住,所以后续调用时,第1个参数设置为NULL

1.4 分割字符串的原理

子字符串的起点是第1个不含分隔符的字符
子字符串的终点是起点之后第1个含有分隔符的字符,或者整个字符串的终止字符
如此往复

2. 头文件

#include <string.h>

3. 例子-分解字符串

#include <string.h>
#include <stdio.h>
 
int main () {
   char str[80] = "This is - www.runoob.com - website";
   const char s[2] = "-";
   char *token;
   
   /* 获取第一个子字符串 */
   token = strtok(str, s);
   
   /* 继续获取其他的子字符串 */
   while( token != NULL ) {
      printf( "%s\n", token );
    
      token = strtok(NULL, s);
   }
   
   return 0;
}

结果:

This is 
 www.runoob.com 
 website      

4. strtok_s

使用时strtok可能会报错,说strtok是不安全的函数,建议使用strtok_s:

error C4996: 'strtok': This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. 

strtok要记住上一个子字符串的位置,所以多线程使用时不安全。

上述报错可以通过设置_CRT_SECURE_NO_WARNINGS预处理定义来解决。

也可以替换成使用strtok_s来解决。

strtok_s的签名如下:

char* strtok_s(char* str, const char* delimiters, char** next_token);

strtok_s多了一个参数next_token,strtok_s把剩下的字符串写到next_token里,这样内部就不用记录子字符串等信息了,从而是线程安全的函数。

把上面的例子改成使用strtok_s,如下:

#include <string.h>
#include <stdio.h>

int main()
{
    char str[80] = "This is - www.runoob.com - website";
    const char s[2] = "-";
    char *token;
    char *next_token = NULL;

    /* 获取第一个子字符串 */
    token = strtok_s(str, s, &next_token);

    /* 继续获取其他的子字符串 */
    while (token != NULL) {
        printf("%s\n", token);

        token = strtok_s(NULL, s, &next_token);
    }

    return 0;
}

结果:

This is 
 www.runoob.com 
 website      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C strtok strtok_s 函数说明 按分隔符分解字符串 的相关文章

随机推荐

  • 机器阅读理解相关论文汇总

    一 综述 1 Emergent Logical Structure in Vector Representations of Neural Readers 二 论文 1 Learning Recurrent Span Representat
  • EduCoder Java程序设计---Java面向对象(第八章) - 文件类答案

    第1关 创建文件 package step1 import java io File import java io FileFilter import java io IOException import java util Scanner
  • k8s基础11——安全控制之RBAC用户授权、RBAC用户组授权、SA程序授权

    文章目录 一 K8s安全框架 1 1 鉴权 1 1 1 HTTPS证书认证 1 1 2 HTTP Token认证 1 2 授权 1 3 准入控制 1 4 集群四大角色 二 RBAC给用户授权 TLS 2 1 签发客户端证书 2 2 生成ku
  • 使用Java的File类实现目录拷贝

    目录 准备工作 Case Analysis 代码实现 总结 准备工作 首先 我们来熟悉下File类 在 Java 中 File 类是 java io 包中唯一代表磁盘文件本身的对象 也就是说 如果希望在程序中操作文件和目录 则都可以通过 F
  • otsu算法_OTSU算法详解

    OTSU是阈值分割中一种常用的算法 它可以根据图像自动生成最佳分割阈值 OTSU的核心思想是类间方差最大化 OTSU算法详解 令 表示一幅大小为 像素的数字图像中的 个不同的灰度级 表示灰度级为 的像素数 图像中的像素总数为 像素的灰度级为
  • VS2017序列号

    趁着这两天微软发布了Visual Studio 2017 安装体验了这个史上最强IDE最新版 分享一下自己的安装过程 下载地址点击这里 该版本堪称史上最大IDE 随便勾了几个选项 就要占用几十个GB的安装空间 最后果断选择了最小安装包 只要
  • uniapp中单选按钮的实现

    标签说明 radio group 单项选择器 内部由多个
  • Java核心技术卷 学习Day02

    java学习 复习 本文主要参照 Java核心技术卷 作为学习对象 第四章 对象与类 1 类 面向对象程序设计OOP 类 封装实例字段 方法 类 gt 继承 is a 依赖 uses a 聚合 has a gt 类 2 预定义类 Math
  • JAVA---抽象类和接口基础知识详解(及两者异同点)

    在本篇博客中将介绍JAVA里抽象类和接口的基础知识以及两者的异同点 在有继承和多态的基础知识上学习会更好 目录 抽象类基础知识 抽象类的定义 创建等基础 抽象类的几点说明 一 为何使用抽象方法 抽象类的几点说明 二 接口基础知识 接口的定义
  • 【Zotero高效知识管理】(1)Zotero介绍

    Zotero高效知识管理 专栏其他文章 Zotero文献管理软件的系统性教程 包括安装 全面的配置 基于众多插件的文献导入 管理 引用 笔记方法 Zotero高效知识管理 2 Zotero的安装 百度云存储配置及常用插件安装 Zotero高
  • jsp调用controller方法_SpringMVC五大核心组件及调用过程

    Spring Web MVC 五大核心组件 DispatcherServlet 控制器入口 负责分发请求 HandlerMapping 负责根据请求 找到对应的控制器 Controller 真正处理请求的控制器 ModelAndView 封
  • 用于光栅仿真的非偏振光–实例讨论

    摘要 像光栅这样的光学设备对光的偏振比较敏感 因此 在仿真中适当考虑光的偏振非常重要 在实际中 光栅有时会以非偏振光作为输入 作为两个正交偏振态的平均值 我们为您展示了如何在VirtualLab Fusion中建模这种用于光栅仿真的非偏振光
  • C语言《文件操作》事无巨细,保姆级介绍,通俗易懂

    目录 1 文件名与文件分类 2 文件操作使用 2 1文件的打开与关闭 3 文件操作函数 3 1其他文件函数 1 fseek 2 ftell 3 rewind 4 文件结束的判定 4 1被错误使用的 feof 4 2文件结束的正确判断 5 文
  • negix安装部署

    1 从nginx官网下载Nginx wget http nginx org download nginx 1 8 1 tar gz 2 解压Nginx tar zxvf nginx 1 8 1 tar gz 3 初始化配置 configur
  • OpenCV(3.4.1) Error: Assertion failed (scn == 3

    错误 OpenCV 3 4 1 Error Assertion failed scn 3 scn 4 in cv cvtColor file D Build OpenCV opencv 3 4 1 modules imgproc src c
  • vi的一些操作

    1 u可撤销操作 2 yy复制当前行 3 p粘贴复制的行 4 dd删除一行 5 xxx可以定位xxx所在位置 6 n或ngg或nG可以跳转到第n行 以下设置是临时的 只在当前vi中生效 但可将其添加在配置文件 etc virc中使每次按文件
  • STM32CubeMX的使用教程

    STM32 关于STM32CubeMX的使用 打开Cube 点击File New Project 搜索芯片型号这边选择的是STM32L071CB系列上面菜单Docs Resources可以下载数据手册程序手册等 点击Start Projec
  • DEBUG:only Tensors of floating point dtype can require gradients

    DEBUG only Tensors of floating point dtype can require gradients 解决 x V t arange 2 4 float requires grad True
  • 4_hytrix_信号量_线程池

    文章目录 Hystrix 核心特性和原理 使用 单独使用 整合 Feign 整合RestTemplate 信号量与线程隔离 线程池隔离 信号量隔离 常用配置 hystrix 使用dashboard Hystrix 核心特性和原理 熔断 连续
  • C strtok strtok_s 函数说明 按分隔符分解字符串

    1 说明 1 1 函数签名如下 char strtok char str const char delimiters 1 str 要被分解成一组小字符串的字符串 2 delimiters 包含分隔符的 C 字符串 1 2 返回值 该函数返回