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会占一个字节,花括号是赋值不会占一个字节

C语言strtok_s函数的更多相关文章

  1. C语言pow函数编写

    C语言pow函数编写 #include<stdio.h> double chaoba(double f,double q); //声明自定义函数 void main(void) { dou ...

  2. C语言-自定义函数

    C语言自定义函数 --1-- 自定义函数定义 1.1 无参无返回值函数 1.2 无参有返回值函数 1.3 有参无返回值函数 1.4 有参有返回值函数 --2-- 函数的参数 2.1 形式参数介绍和使用 ...

  3. C语言printf()函数:格式化输出函数

    C语言printf()函数:格式化输出函数 头文件:#include <stdio.h> printf()函数是最常用的格式化输出函数,其原型为:     int printf( char ...

  4. C语言的函数

    "函数"在英文的翻译是"function",无论在自然科学还是计算机科学都是这个词,而"function"的本意是"功能" ...

  5. c语言main函数返回值、参数详解(返回值是必须的,0表示正常退出)

    C语言Main函数返回值 main函数的返回值,用于说明程序的退出状态.如果返回0,则代表程序正常退出:返回其它数字的含义则由系统决定.通常,返回非零代表程序异常退出. 很多人甚至市面上的一些书籍,都 ...

  6. Go语言示例-函数返回多个值

    Go语言中函数可以返回多个值,这和其它编程语言有很大的不同.对于有其它语言编程经验的人来说,最大的障碍不是学习这个特性,而是很难想到去使用这个特性. 简单如交换两个数值的例子: package mai ...

  7. 【学习笔记】【C语言】函数

    一. 什么是函数 任何一个C语言程序都是由一个或者多个程序段(小程序)构成的,每个程序段都有自己的功能,我们一般称这些程序段为“函数”.所以,你可以说C语言程序是由函数构成的. 比如你用C语言编写了一 ...

  8. 【转载】 c语言inline函数的使用

    c语言inline函数的使用 转载自:http://blog.chinaunix.net/uid-21843265-id-3056446.html 大学在教科书上学习过inline函数,定义为inli ...

  9. 【C语言】函数和自定义函数

    函数,我之前也提到过一点点内容.其实函数是很好理解的,但是写起来又十分麻烦. 一.     函数引入 我们知道,C源程序是由函数组成的.请看下面的简单函数例子 #include <stdio.h ...

随机推荐

  1. js字符串数组['1','2','3']转number

    let arr = ['1','2','3']; arr.split(',').map(Number);

  2. 35个JAVA性能优化总结

    原文链接:http://mp.weixin.qq.com/s/J614jGM_oMrzdeS_ivmhvA   代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对 ...

  3. C# 计算三角形和长方形 周长面积

    编写一个控制台应用程序,输入三角形或者长方形边长,计算其周长和面积并输出. 代码如下: using System; using System.Collections.Generic; using Sy ...

  4. 【记录一个问题】cv::cuda::BufferPool发生assert错误

    cv::cuda::setBufferPoolUsage(true); const int width = 512; const int height = 848; const int channel ...

  5. POSIX之共享内存

    shm_write.c: #include<stdio.h> #include<stdlib.h> #include <stdlib.h> #include < ...

  6. Go 面向对象三大特性

    #### Go 中面向对象的三大特性上周因为有一些事情,停更了; 停更的这段时间,花了点时间做了一个小项目(https://github.com/yioMe/node_wx_alipay_person ...

  7. 集合框架-LinkedList集合(有序不唯一)

    1 package cn.itcast.p2.linkedlist.demo; 2 3 import java.util.Iterator; 4 import java.util.LinkedList ...

  8. Ubuntu 14.04更换内核

    1:查看当前安装的内核 dpkg -l|grep linux-image 2:查看可以更新的内核版本: sudo apt-cache search linux-image 3:安装新内核 sudo a ...

  9. asp.net core监控—引入Prometheus(三)

    上一篇博文中说到Prometheus有四种指标类型:Counter(计数器).Gauge(仪表盘).Histogram(直方图).Summary(摘要),并且我们做了一个Counter的Demo,接下 ...

  10. X000010

    P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意:求 \({\rm S}(n,m)=\sum\limits_{i=1}^n\sum\limits_{j=1}^m{\rm lcm} ...