注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Aspirer's blog

停止维护,新博客地址:http://aspirer.wang/

 
 
 

日志

 
 

字符串分割函数strtok  

2009-08-11 09:37:53|  分类: 学习心得 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

字符串分割函数strtok - aspirer - Aspirers blog

 

#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <stddef.h>

size_t strSpn(const char *str, const char *charset)
//库函数strspn()可实现该功能

{
 size_t i = 0, j;
 size_t strLength, charsetLen;
 if (str == NULL || charset == NULL)
 {
  return i;
 }

 strLength = strlen(str);
 charsetLen = strlen(charset);

 for (i = 0; i < strLength; ++i)
 {
  for (j = 0; j < charsetLen; ++j)
  {
   if (str[i] == charset[j])
   {
    break;
   }
  }
  if (j == charsetLen)
  {
   return i;
  }
 }
 return i;
}

size_t strCspn(const char *str, const char *split)

//库函数strcspn()可实现该功能
{
 size_t i = 0;
 const char *st;
 const char *sp;
 if (NULL == str || NULL == split)
 {
  return i;
 }
 
 for (st = str; *st != '\0'; st++)
 {
  for (sp = split; *sp != '\0'; sp++)
  {
   if (*st == *sp)
   {
    break;
   }
  }
  if (*sp != '\0')
  {
   i = st - str;
   return i;
  }
 }

 i = st - str;
 return i;
}

char *strToken(char *str, const char *split)
{
 static char *old = NULL;
 static int i = 0;
 char *ret;
 size_t j;
 if (0 == i)
 {
  if (NULL == str)
  {
   return NULL;
  }
  if (NULL == split)
  {
   return str;
  }  
 }

 if (i)
 {
  if (NULL == old || '\0' == *old)
  {
   old = NULL;
   return NULL;
  }
  str = old;
 }
 i++;

 j = strSpn(str, split);
 ret = str + j;
 j = strCspn(ret, split);
 *(ret + j) = '\0';
 old = ret + j + 1;
 
 return ret;
}

char *strTok_r(const char *str, const char *split, char **savestr)
{
 char *ret;
 size_t i;
 if (NULL == str || NULL == split)
 {
  *savestr = NULL;
  return NULL;
 }
 if ('\0' == *str)
 {
  *savestr = NULL;
  return NULL;
 }

 if ('\0' == *split)
 {
  *savestr = NULL;
  return (char *)str;
 }

 ret = (char *)(str + strSpn(str, split));
 i = strCspn(ret, split);
 *(ret + i) = '\0';
 *savestr = (ret + i +1);
 return ret;
}

int main()
{
 char str[] = ":::test:abc::defg:::h:";

  char s[] = ":::test:abc::defg:::h:";
 char split[] = "ae:";
 char *token = strToken(str, split);

 char *savestr;
 if (token)
 {
  puts(token);
 }
 while (token = strToken(NULL, split))
 {
  puts(token);
 }

 savestr = s;
 while (token = strTok_r(savestr, split, &savestr))
 {
  puts(token);
  //str = savestr;
 }

 //printf("%d\n", strCspn("ddd::::", split));
 return 0;
}


#include <string.h>
#include <stdio.h>
#include <assert.h>
char *strToken(char *str, const char *split)
{
 static char *old = NULL; 
 static int i = 0;
 char *p = old;
 char *curr;     //当前处理到的字符
 int j, k, firstnonsplitchar = 0; //firstnonsplitchar:标记非分割字符开始
 int longstrlen, splitstrlen;
 if (i == 0 && (str == NULL || split == NULL))
 {    
  return NULL;
 }
 
 if (i != 0)
 {
  if (NULL == old || '\0' == *old)
  {
   return NULL;
  }
  
  str = old;
 }
 i = 1;
 curr = str;
 longstrlen = strlen(str);
 splitstrlen = strlen(split);
 for (j = 0; j < longstrlen; ++j)
 {
  for (k = 0; k < splitstrlen; ++k)
  {
   //如果在被分割字符串中找到分割字符
   if (str[j] == split[k])
   {
    str[j] = '\0';    //将找到的分割字符替换为结束符
    curr = str + j + 1; //当前处理字符后移   
    break;
   }
  }
  //如果在被分割字符串中没有找到分割字符
  //并且非分隔字符开始标记为0
  //则得到一个分割并将非分隔符开始标记为1
  //即第一次找到一个非分隔字符
  if (k == splitstrlen && firstnonsplitchar == 0)
  {
   p = curr;
   firstnonsplitchar = 1;   
  }
  //如果找到了分割字符
  //并且分割已经开始(第二次找到分隔符)
  //则本次分割结束,返回分割结果
  if (k < splitstrlen && firstnonsplitchar == 1)
  {   
   old = curr;
   return p;
  }
  //如果没有找到分隔符,并且分割开始
  //(k == splitstrlen && firstnonsplitchar == 1)
  //继续向后搜索分隔符

  //如果找到了分隔符,并且分割尚未开始(没找到非分隔字符)
  //(k < splitstrlen && firstnonsplitchar == 0)
  //继续向后搜索非分隔符
 }
 //如果后面没有分割符,则返回整个字符串
 return p;
}

int main()
{
 char str[] = ":::test:abc::defg:::h:";
 char split[] = ":cs";
 char *token = strToken(str, split);
 if (token)
 {
  puts(token);
 }
 while (token = strToken(NULL, split))
 {
  puts(token);
 }
 return 0;
}

  评论这张
 
阅读(624)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018