strtok_s 在C语言中的作用是分割出一个字符串中的单词

在MSDN上参数表:

strtok_s

strToken String containing token or tokens.
strDelimit Set of delimiter characters.
context Used to store position information between calls to strtok_s
locale Locale to use.

4个参数的含义:

strToken

这个参数用来存放需要分割的字符或者字符串整体

strDelimit

这个参数用来存放分隔符(例如:,.!@#$%%^&*() \t \n之类可以区别单词的符号)

context

这个参数用来存放被分割过的字符串

locale

这个参数用来储存使用的地址

//虽说有4个参数,但是我们可控参数只有3个locale是不可控的

remark:

与这个函数相近的函数:

wcstok_s 宽字节版的strtok_s

_mbstok_s 多字节版的strtok_S

===============================================================================================================================================

接下来我们来看这个函数的运行过程:

在首次调用strtok_s这个功能时候会将开头的分隔符跳过然后返回一个指针指向strToken中的第一个单词,在这个单词后面茶插入一个NULL表示断开。多次调用可能会使这个函数出错,context这个指针一直会跟踪将会被读取的字符串。

跟踪以下代码中的参数来更好的理解这个函数:

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

char string[] =
".A string\tof ,,tokens\nand some  more tokens";
char seps[] = " .,\t\n";
char *token = NULL;
char *next_token = NULL;

int main(void)
{
    printf("Tokens:\n");

// Establish string and get the first token:
    token = strtok_s(string, seps, &next_token);

// While there are tokens in "string1" or "string2"
    while (token != NULL)
    {
        // Get next token:
        if (token != NULL)
        {
            printf(" %s\n", token);
            token = strtok_s(NULL, seps, &next_token);
        }
    }
    printf("the rest token1:\n");
    printf("%d", token);
}

环境:VS2013

采用F11逐步调试:

======================================================================================================

当程序运行完17行的语句时值

token的值由A覆盖NULL

next_token的值由A后其余所有的字符覆盖了NULL

因此token!=NULL

符合进入While语句的条件、

当程序进入whlie语句运行完24行时

token的值被覆盖为string

next_token的值被覆盖为string后的字符串

经过几次循环之后

token中的值变为NULL

next_token中的值为空被取时,会被函数去掉末尾的\0(由双引号加上去的)//tips:给数组赋值时,双引号是初始化,初始化会在末尾加一个\0所以给一个数组初始化时\0会占一个字节,花括号是赋值不会占一个字节

最新文章

  1. strchr()函数 和 strrchr() 函数
  2. shell 输出九九乘法表
  3. 理解AUC
  4. 《深入浅出Windows 10通用应用开发》
  5. 学习HTML5之塔克大战(详细记录)
  6. wdatepicker minDate&amp;maxDate
  7. form表单 无法提交js动态添加的表单元素问题。。
  8. Apriori学习笔记
  9. tomcat在linux中的启动和查看相关信息
  10. 学习笔记——策略模式Strategy
  11. block、inline、inline-block对比
  12. SQL server 数据库(视图、事物、分离附加、备份还原))
  13. openresty 中mime.types 文件缺失问题,无法展示图片
  14. ubuntu14.04行更新软件包
  15. IDEA 中配置JDK
  16. MAC下Intellij IDEA常用快捷键
  17. Openstack window 10 镜像制作
  18. allegro中Autosilk top, Silkscreen top 和Assembly top三个什么区别(转)
  19. 【java】JVM的内存区域划分
  20. 【Unity笔记】摄像机、图片的模糊处理

热门文章

  1. react中使用antd按需加载(第一部)
  2. JDBC简单查询数据库
  3. vue重置data
  4. XCTF(Web_php_unserialize)
  5. JS里默认和常用转换
  6. spring是线程安全的吗
  7. Google Java 风格指南(Google Java Style Guide)
  8. 【刷题-LeetCode】289. Game of Life
  9. 【刷题-PAT】A1119 Pre- and Post-order Traversals (30 分)
  10. vue学习8-for循环