33,318
社区成员
发帖
与我相关
我的任务
分享
理解和讨论之前请先学会如何观察!
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?
/***
*strtok_s.c - tokenize a string with given delimiters
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines strtok_s() - breaks string into series of token
* via repeated calls.
*
*******************************************************************************/
#include <string.h>
#include <internal_securecrt.h>
#define _FUNC_PROLOGUE
#define _FUNC_NAME strtok_s
#include <strtok_s.inl>
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strtok_s.inl
/***
*tcstok_s.inl - implementation of strtok_s
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* This file contains the algorithm for strtok_s.
*
****/
_FUNC_PROLOGUE
char * __cdecl _FUNC_NAME(char *_String, const char *_Control, char **_Context)
{
unsigned char *str;
const unsigned char *ctl = _Control;
unsigned char map[32];
int count;
/* validation section */
_VALIDATE_POINTER_ERROR_RETURN(_Context, EINVAL, NULL);
_VALIDATE_POINTER_ERROR_RETURN(_Control, EINVAL, NULL);
_VALIDATE_CONDITION_ERROR_RETURN(_String != NULL || *_Context != NULL, EINVAL, NULL);
/* Clear control map */
for (count = 0; count < 32; count++)
{
map[count] = 0;
}
/* Set bits in delimiter table */
do {
map[*ctl >> 3] |= (1 << (*ctl & 7));
} while (*ctl++);
/* If string is NULL, set str to the saved
* pointer (i.e., continue breaking tokens out of the string
* from the last strtok call) */
if (_String != NULL)
{
str = _String;
}
else
{
str = *_Context;
}
/* Find beginning of token (skip over leading delimiters). Note that
* there is no token iff this loop sets str to point to the terminal
* null (*str == 0) */
while ((map[*str >> 3] & (1 << (*str & 7))) && *str != 0)
{
str++;
}
_String = str;
/* Find the end of the token. If it is not the end of the string,
* put a null there. */
for ( ; *str != 0 ; str++ )
{
if (map[*str >> 3] & (1 << (*str & 7)))
{
*str++ = 0;
break;
}
}
/* Update context */
*_Context = str;
/* Determine if a token has been found. */
if (_String == str)
{
return NULL;
}
else
{
return _String;
}
}

