C语言strtok_s函数

 

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

在MSDN上参数表:

 

strtok_s

strTokenString containing token or tokens.
strDelimitSet of delimiter characters.
contextUsed to store position information between calls to strtok_s
localeLocale 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逐步调试:

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

image

 

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

token的值由A覆盖NULL

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

因此token!=NULL

符合进入While语句的条件、

 

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

image

token的值被覆盖为string

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

经过几次循环之后

token中的值变为NULL

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

image

转载于:https://www.cnblogs.com/luverose/p/4248992.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值