• strtok、strtok_s、strtok_r 字符串分割函数


    1、strtok函数

    函数原型:char * strtok (char *str, const char * delimiters);
    参数:str,待分割的字符串(c-string);delimiters,分割符字符串。
     
    使用方法:该函数用来将字符串分割成一个个片段。参数str指向欲分割的字符串,参数delimiters则为分割字符串中包含的所有字符。当strtok()在参数s的字符串中发现参数delimiters中包涵的分割字符时,则会将该字符改为 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。
     
    原理:作用于字符串str,以包含在delimiters中的字符为分界符,将str切分成一个个子串;如果,s为空值NULL,则函数保存的指针SAVE_PTR在下一次调用中将作为起始位置。
     
    注意:1.使用该函数进行字符串分割时,会破坏被分解字符串的完整,调用前和调用后的s已经不一样了。第一次分割之后,原字符串str是分割完成之后的第一个字符串,剩余的字符串存储在一个静态变量SAVE_PTR中,因此多线程同时访问该静态变量时,则会出现错误。
       2.delimiters中包含多字符:GNU C Library中对strtok的功能定义:“Parse S into tokens separated by characters in DELIM”。也就是说包含在delim中的字符均可以作为分隔符,而非严格匹配。可以把delim理解为分隔符的集合。这一点是非常重要的。
       3.如果第一个字符就是分割字符,将自动省略掉
    // crt_strtok.c
    // compile with: /W3
    // In this program, a loop uses strtok
    // to print all the tokens (separated by commas
    // or blanks) in the string named "string".
    //
    #include <string.h>
    #include <stdio.h>
    
    char string[] = "A string	of ,,tokens
    and some  more tokens";
    char seps[]   = " ,	
    "; // 字符','  '	'  '
    '都作为分割字符
    char *token;
    
    int main( void )
    {
       printf( "Tokens:
    " );
     
       // Establish string and get the first token:
       token = strtok( string, seps ); // C4996
       // Note: strtok is deprecated; consider using strtok_s instead
       while( token != NULL )
       {
          // While there are tokens in "string"
          printf( " %s
    ", token );
    
          // Get next token: 
          token = strtok( NULL, seps ); // C4996
       }
    }

     结果:

    Tokens:
     A
     string
     of
     tokens
     and
     some
     more
     tokens
    Program ended with exit code: 0

    2、strtok_s函数

    strtok_s是windows下的一个分割字符串安全函数,其函数原型如下:
    char *strtok_s( char *strToken, const char *strDelimit, char **buf);
    这个函数将剩余的字符串存储在buf变量中,而不是静态变量中,从而保证了安全性。

    3、strtok_r函数

    strtok_s函数是linux下分割字符串的安全函数,函数声明如下:
    char *strtok_r(char *str, const char *delim, char **saveptr);
    该函数也会破坏带分解字符串的完整性,但是其将剩余的字符串保存在saveptr变量中,保证了安全性。
  • 相关阅读:
    atoi (String to Integer) leetcode
    按层逆遍历一棵树,使用满二叉树存储
    unix网络编程-配置unp.h头文件
    ListView系列(七)——Adapter内的onItemClick监听器四个arg参数
    Windows系统下安装VirtualBox,系统找不到指定路径的做法
    Android Fragment完全解析,关于碎片你所需知道的一切
    【Android开源框架列表】
    fragment报错
    2013 年开源中国 10 大热门 Java 开源项目
    【移动开发】Android中三种超实用的滑屏方式汇总(ViewPager、ViewFlipper、ViewFlow)
  • 原文地址:https://www.cnblogs.com/sdlwlxf/p/4354310.html
Copyright © 2020-2023  润新知