实现strtok

/*
实现strtok 
*/

/*
解题报告:
1、用二进制中每位记录分隔字符
   对注释1的解释: 因为数组中每个下标记录8位(每个下标能记录8种状态),因此右移3位
   (3位表示十进制的8)因为数组中每个元素表示8位,因此将分隔符与7做&运算,这样得
   到的结果也就有8种状态,对应上了8位,再右移相应的位数,正好将8位中相应的位设置上
   做 | 运算是因为不去影响其他的位
*/

/*
  Author: Unimen
  Date: 27/09/2011 19:29
  Description: 实现strtok 
*/

#include <iostream>
#include <cstring>
using namespace std;

char *mystrtok(char *strStr, const char *control)
{
	int i;
	const char *ctrl = control;
	char *str = NULL;
	static char *nextoken = NULL; //static具有记忆功能,下次执行函数时依然有效 
	char map[32];   //256位的位图,用来记录分隔字符中的每个字符,注意这个技巧	
	for (i=0; i<32; ++i)
	{
		map[i] = 0;
	}
	
	//将分隔符记录到map数组中
	do
	{
		map[*ctrl>>3] |= (1<<(*ctrl&7)); //注释1  
	}while (*ctrl++); 
	
	if (strStr)
	{
		str = strStr;	
	}
	else
	{
		str = nextoken; 
	}
	
	//去除开头的分隔字符
	while ((map[*str>>3] & 1<<(*str&7)) && *str)
	{
		++str;
	} 
	
	strStr = str;
	
	for (; *str; ++str)
	{
		//如果字符串中的字符为分隔字符,就进行分隔
		if (map[*str>>3] & (1<<(*str&7)))
		{
			*str++ = '\0';
			break;
		}	
	}
	
	//用static变量记下str的位置
	nextoken = str;
	//返回分隔后的字符串
	if (strStr == str)
		return NULL;
	else	
		return strStr; 
	
}

int main()
{
	char test[] = "Hello world! haha!";
	char *control = " ";
	char *p = NULL;
	p = mystrtok(test, control);
	while (p)
	{
		cout<<p<<endl;
		p = mystrtok(NULL, control);
	}
	return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
函数实现strtok是为了将一个字符串按照指定的分隔符进行切割。首先,需要定义几个静态区变量来记录切割的位置和状态。当字符串被切割完成后,再次调用strtok函数会返回一个空指针。 具体的实现方法可以参考上面的特殊位置的函数调用分析。我们可以使用一个循环来遍历字符串,每次查找到分隔符时,将分隔符之前的部分作为一个切片返回,并更新静态区变量中的位置信息。当字符串遍历到末尾时,返回最后一个切片或空指针。 要注意的是,由于strtok函数具有记录功能,所以在函数的定义时需要定义一些静态区变量来保存位置和状态信息,以便在函数结束时依然可以记录数据。这些静态区变量可以在函数内部定义,也可以作为参数传入函数中。 总结起来,函数实现strtok的关键是使用一个循环来遍历字符串,查找分隔符,并返回切片。同时,需要使用静态区变量来记录位置和状态信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [c语言中strtok函数详解,手把手教你自主实现字符串切割函数,内附详细代码。](https://blog.csdn.net/qq_51004011/article/details/123773752)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值