函数重现系列导航
1. 函数简介
strtok 函数为 C 库函数之一,用于分割字符串。
- 原型:
char* strtok (char* str, const char* delim);
- 所属头文件:<string.h>
- 功能:使用
delim
指向的字符串中的字符分解str
指向的字符串,str
指向的字符串中与delim
指向的字符串的交集的字符都将被“\0
”替换,达到分割的效果。当str
为 NULL 时,函数将对上一次函数调用所分割的剩余字符串继续进行分割。- 返回:分割得到的子字符串,无法继续进行分割时将返回 NULL。
2. 使用示例
int main()
{
char str[80] = " - www.baidu.com - webs -";
const char* delim = "- ";
char* token = NULL;
/* 获取第一个子字符串 */
token = strtok(str, delim);
/* 继续获取其他的子字符串 */
while (token != NULL)
{
printf("%delim\n", token);
token = mystrtok(NULL, delim);
}
}
程序运行结果如下:
www.baidu.com
webs
可见,“- www.baidu.com - webs -
” 中的“-
”与“”两字符都被“
\0
”所替换,字符串被切割为“www.baidu.com
”与“webs
”两子串。
3. 函数说明
- 既然为 strtok 函数的重现,那么所重现的 strtok 函数的基本功能、调用方法应与原库函数保持一致。
- strtok 函数内部使用一个静态局部指针指向传参目标字符串,这样当
str
为 NULL 时能够继续对上一次函数调用所分割的剩余字符串的进行分割。- 每次函数调用只分割一段子字符串,且需要对
str
的前部分字符为替换字符的情况进行处理,保证返回正确的切割子字符串。
4. 函数重现
char* strtok (char* str, const char* delim)
{
// 计算替换字符串的长度
int len = 0;
const char* p = delim;
while (*p++ != '\0')
{
len++;
}
// 使用 static 类型指针保存上一次函数调用时的字符串地址
static char* pstr = NULL;
if (str != NULL)
{
pstr = str;
}
// 保证 pstr 指向以非替换字符为首的子字符串
while (*pstr != '\0')
{
int i = 0;
for (; i < len; i++)
{
if (delim[i] == *pstr)
{
*pstr = '\0';
break;
}
}
if (i == len)
{
break;
}
else
{
pstr++;
}
}
// ret 保存返回子字符串的首地址
char* ret = (*pstr != '\0') ? pstr : NULL;
while (*pstr != '\0')
{
int i = 0;
for (; i < len; i++)
{
if (delim[i] == *pstr)
{
// pstr 最后指向替换字符的下一字符,此时已得到一个切割的子字符串
*pstr++ = '\0';
return ret;
}
}
pstr++;
}
return ret;
}