C++ strtok函数详解

简介: C++ strtok函数详解

strtok函数的作用是把字符串以规定的字符分割开:


头文件


#include <string.h>


函数原型


char *strtok(char s[], const char *delim);


参数


  • str – 要被分解成一组小字符串的字符串。


  • delim – 包含分隔符的 C 字符串。


返回值


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


注意:


  1. 分割处理后原字符串 str 会变,变成第一个子字符串


  1. strtok函数会把分割前的字符串破坏掉,即每次分割后,原来的字符串就会少掉一部分,完整性会被破坏。


例如:第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量中,因此多线程同时访问该静态变量时,则会出现错误


使用案例


strtok函数会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。如果要保持原字符串的完整,可以使用strchr和sscanf的组合等。


#include <string.h>
#include <stdio.h>
int main () {
   char str[80] = "this is - CSDN - blog";
   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 
 CSDN 
  blog


拓展strtok_s与strtok_r


strtok_s函数


strtok_s是windows下的一个分割字符串安全函数,其函数原型如下:


char *strtok_s( char *strToken, const char *strDelimit, char **buf);


这个函数将剩余的字符串存储在buf变量中,而不是静态变量中,从而保证了安全性。


strtok_r函数


strtok_s函数是linux下分割字符串的安全函数,函数声明如下:


char *strtok_r(char *str, const char *delim, char **saveptr);


该函数也会破坏待分解字符串的完整性,但是其将剩余的字符串保存在saveptr变量中,保证了安全性。


拓展用例:


linux C:


#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
int main()  
{  
    char str[]="ab,cd,ef";  
    char *ptr;  
    char *p;  
    printf("before strtok: str=%s\n",str);  
    printf("begin:\n");  
    ptr = strtok_r(str, ",", &p);  
    while(ptr != NULL){  
      // 输出时候 str都是 ab  也会被切割  破坏待分解字符串的完整性
        printf("str=%s\n",str);  
        printf("ptr=%s\n",ptr);  
        ptr = strtok_r(NULL, ",", &p);  
    }  
    return 0;  
}


输入结果:


before strtok: str=ab,cd,ef 
begin: 
str=ab 
ptr=ab 
str=ab 
ptr=cd 
str=ab 
ptr=ef
相关文章
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
94 0
|
7月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
357 6
|
12月前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
12月前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
445 6
|
12月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
108 3
|
12月前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
197 0
C++ 多线程之线程管理函数
|
12月前
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
84 3
|
12月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
2060 1
|
12月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
139 1
|
12月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
183 0
C++入门6——模板(泛型编程、函数模板、类模板)