自己写的一个功能类似于strtok函数的函数
2016-05-20 22:20
369 查看
#include <stdio.h>
//字符串比较函数,两个字符串相同就返回1,否则返回0
static int my_strcmp( const char *dest, const char *src, int len)
{
int i;
for(i = 0;i < len; i++)
{
if(src[i] != dest[i])
{
return(0);
}
}
return(1);
}
char *my_strtok(char *str, const char *delim)
{
int i = 0;
int len = strlen(delim);
char *ret_p;
char *temp; //临时变量,用来遍历字符串str
static char *save_p; //静态变量用来保存上一次返回地址
temp = (str == NULL) ? save_p : str;//如果是第一次使用,则从字符串首地址开始查找,否则从上一次返回的地点开始查找
ret_p = temp; //需要返回的地址
if(1 == len) //如果delim只有一个字符,就直接比较,不需调用 my_strcmp函数
{
/*****************************************/
while(*temp != '\0')
{
if(*delim == *temp)
{
*temp = '\0'; //将字符串从此处"剪断"
save_p = ++temp;
return(ret_p);
}
temp++;
}
// return(NULL);
}
else //如果delim有多个个字符,就my_strcmp函数, 这样代码简单
{
/******************************************/
while(*temp != '\0')
{
if(my_strcmp(temp,delim,len) == 1)
{
*temp = '\0';
save_p = temp + len;
return(ret_p);
}
temp++;
}
}
return(NULL); //没找到匹配字符或字符串时返回NULL
}
int main()
{
#if 0
char src[] = "2016//05//20 11::19::32 \0";
char *str = my_strtok(src,"//");
printf("%s\n",str);//2016
str = my_strtok(NULL,"//");
printf("%s\n",str);//05
str = my_strtok(NULL," ");
printf("%s\n",str);//20
str = my_strtok(NULL,"::");
printf("%s\n",str);//11
str = my_strtok(NULL,"::");
printf("%s\n",str);//19
str = my_strtok(NULL," ");
printf("%s\n",str);
#else
char src[]="2016/05/20 11:19:32 \0";
char *str = my_strtok(src,"/");
printf("%s\n",str);//2016
str = my_strtok(NULL,"/");
printf("%s\n",str);//05
str = my_strtok(NULL," ");
printf("%s\n",str);//20
str = my_strtok(NULL,":");
printf("%s\n",str);//11
str = my_strtok(NULL,":");
printf("%s\n",str);//19
str = my_strtok(NULL," ");
printf("%s\n",str);
#endif
return(0);
}
函数运行结果是在屏幕上打印
2016
05
20
11
19
32
函数的功能是在字符串str中查找delim字符串,找到后把第一个匹配的字符换成'\0',并且返回一个指向一开始查找的字符的地址,
如 char *str="1234567"; char *delim = "5";函数在str中找到'5'后,将'5'换成‘\0’,返回'1'的地址.,在返回前,将'6'的地址保存在
静态的 局部指针 save_p 中,下次调用strtok函数时从 save_p 指向的地址开始查找字符串。第一次调用strtok函数时需要传入一个
地址给 str,之后调用时传NULL给str。
//字符串比较函数,两个字符串相同就返回1,否则返回0
static int my_strcmp( const char *dest, const char *src, int len)
{
int i;
for(i = 0;i < len; i++)
{
if(src[i] != dest[i])
{
return(0);
}
}
return(1);
}
char *my_strtok(char *str, const char *delim)
{
int i = 0;
int len = strlen(delim);
char *ret_p;
char *temp; //临时变量,用来遍历字符串str
static char *save_p; //静态变量用来保存上一次返回地址
temp = (str == NULL) ? save_p : str;//如果是第一次使用,则从字符串首地址开始查找,否则从上一次返回的地点开始查找
ret_p = temp; //需要返回的地址
if(1 == len) //如果delim只有一个字符,就直接比较,不需调用 my_strcmp函数
{
/*****************************************/
while(*temp != '\0')
{
if(*delim == *temp)
{
*temp = '\0'; //将字符串从此处"剪断"
save_p = ++temp;
return(ret_p);
}
temp++;
}
// return(NULL);
}
else //如果delim有多个个字符,就my_strcmp函数, 这样代码简单
{
/******************************************/
while(*temp != '\0')
{
if(my_strcmp(temp,delim,len) == 1)
{
*temp = '\0';
save_p = temp + len;
return(ret_p);
}
temp++;
}
}
return(NULL); //没找到匹配字符或字符串时返回NULL
}
int main()
{
#if 0
char src[] = "2016//05//20 11::19::32 \0";
char *str = my_strtok(src,"//");
printf("%s\n",str);//2016
str = my_strtok(NULL,"//");
printf("%s\n",str);//05
str = my_strtok(NULL," ");
printf("%s\n",str);//20
str = my_strtok(NULL,"::");
printf("%s\n",str);//11
str = my_strtok(NULL,"::");
printf("%s\n",str);//19
str = my_strtok(NULL," ");
printf("%s\n",str);
#else
char src[]="2016/05/20 11:19:32 \0";
char *str = my_strtok(src,"/");
printf("%s\n",str);//2016
str = my_strtok(NULL,"/");
printf("%s\n",str);//05
str = my_strtok(NULL," ");
printf("%s\n",str);//20
str = my_strtok(NULL,":");
printf("%s\n",str);//11
str = my_strtok(NULL,":");
printf("%s\n",str);//19
str = my_strtok(NULL," ");
printf("%s\n",str);
#endif
return(0);
}
函数运行结果是在屏幕上打印
2016
05
20
11
19
32
函数的功能是在字符串str中查找delim字符串,找到后把第一个匹配的字符换成'\0',并且返回一个指向一开始查找的字符的地址,
如 char *str="1234567"; char *delim = "5";函数在str中找到'5'后,将'5'换成‘\0’,返回'1'的地址.,在返回前,将'6'的地址保存在
静态的 局部指针 save_p 中,下次调用strtok函数时从 save_p 指向的地址开始查找字符串。第一次调用strtok函数时需要传入一个
地址给 str,之后调用时传NULL给str。
相关文章推荐
- 科研及文章指南
- poj3122 binary search 实数区间
- multiple 小笔记
- 基于TCP协议之——socket编程
- Hibernate学习(1--8)
- opencv学习笔记(二)寻找轮廓
- hadoop fs.trash 详解
- 详解likely和unlikely函数
- 在Ubuntu下安装Samba文件服务器(译)
- JAVA简单读取xls表格
- MySQL入门——修改数据表4:添加主键约束、显示表结构、添加唯一约束
- 剑指offer09--输入n后输出所以n位数
- linux的ulimit各种限制之深入分析
- rails and gem is currently not installed (解决)
- CSDN、网易、腾讯等博客导入wordpress
- Linux常用命令--目录管理、文件管理、权限管理
- Android开发-数据存储SharedPreferences工具类、Set<String>保存问题、源码分析
- leetcode8- String to Integer (atoi 字符串转整数)
- 2016-05-20 小记
- hdu3072 Intelligence System(Tarjan缩点+最小生成树)