无法成功使用这个strtok函数,哪里出错了?

SHOUYU2 2010-12-08 04:14:13
#include <stdio.h>

char* strtok(char* string_org, char* demial)

{
char* last; //保存分隔后剩余的部分
char* str; //返回的字符串
char* ctrl = demial;//分隔字符

//把分隔字符放到一个索引表中。定义32是因为ASCII字符表最多是0~255个,也是说用最大的255右移3位,也就是除以8一定会是32中的一个数。
char map[32];
int count;


for (count =0; count <32; count++)
{
map[count] = 0;
}
do
{
map[*ctrl >> 3] |= (1 << (*ctrl & 7));
} while (*ctrl++);

if (string_org)
{
str = string_org;
}
else
str = last;

//while ((map[*str >> 3] & (1 << (*str & 7))) && *str) //看有没有,同时看str为不为空
// str++;
string_org = str;
for (;*str; str++)
{
if ( map[*str >> 3] & (1 << (*str & 7)))
{
*str++ = '\0';//当找到时,把匹配字符填为0,并且把str指向下一位。
break; //退出循环
}

}
last =str; // 把剩余字符串的指针保存到静态变量last中。
if (string_org == str)
{
return NULL;
}
else
{
return string_org; //找到了,返回之前字符串的头指针
}
}
main()
{
char str[]="we123likt22his";
char temp[] = "0123456789";
char *tokon;
tokon = strtok(str,temp);
while(NULL != tokon)
{
printf("%s\n",tokon);
tokon = strtok(NULL,temp);
}
getchar();

puts(tokon);
getchar();
}

应该是输出:
we
likt
his
可能是哪里内存使用出错了,这种问题应该怎样调试呢?
...全文
660 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
angel_su 2010-12-08
  • 打赏
  • 举报
回复
_TOKEN貌似是个宏来的...
SHOUYU2 2010-12-08
  • 打赏
  • 举报
回复
为什么我用VC6调试的时候,无法看last值的变化?
pur_e 2010-12-08
  • 打赏
  • 举报
回复
vc的源码是用了一个全局变量_TOKEN来存储上次解析到的位置

pur_e 2010-12-08
  • 打赏
  • 举报
回复
唉,看了你的问题去翻了下strtok的源码,确实很不错,写出来心得分享下,至于你的问题,last需要用全局变量或者static的,因为需要存储剩余字符啊,局部变量的话下次调用就清空了


//官方的strtok函数,用来通过分隔字符(不支持字符串,传入的串中每个字符单独当分隔符,如下例子组合的如123会处理1而23会被跳过),返回分隔的串的首地址
//比如调用strtok("abc123def","123456");
//返回值是指向abc的指针
//下次要获得"def",需要调用strtok(NULL,"123456");函数用了一个全局变量_TOKEN来存储上次解析到的位置

/*
这里的方法比较巧,用一个32的byte数组中的每一位表示ascii字符表中的255个字符是否存在,
用的是位移的方法,关键就是这句,map[*ctrl >> 3] |= (1 << (*ctrl & 7));
*ctrl >> 3:用字符的前5位来当索引,将255个字符分为32组
1 << (*ctrl & 7):用后三位的值来当每一组的索引,表明自己是哪一位,比如:后三位是010=2,说明是第二位
|=:最后来个或操作,将那一位置为1
*/
/*
要判断字符是不是存在在索引中也就简单了,
map[*str >> 3] & (1 << (*str & 7))
值为1说明这个字符是存在的
*/

SHOUYU2 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 angel_su 的回复:]
last =str; // 把剩余字符串的指针保存到静态变量last中

char* last; //保存分隔后剩余的部分

不一致...
[/Quote]
怎么不一致?能说具体点吗?

我把char* last;改成static char* last就可以了
SHOUYU2 2010-12-08
  • 打赏
  • 举报
回复
当然是c自带的strtok,我自己调试用用,看看实现细节
angel_su 2010-12-08
  • 打赏
  • 举报
回复
last =str; // 把剩余字符串的指针保存到静态变量last中

char* last; //保存分隔后剩余的部分

不一致...
就想叫yoko 2010-12-08
  • 打赏
  • 举报
回复
汗,我还以为你不会用呢,给你在MSDN上找了一下
你自己再去GOOGLE一下它的实现吧
// crt_strtok.c
// compile with: /W1
// In this program, a loop uses strtok
// to print all the tokens (separated by commas
// or blanks) in the string named "string".
//
#include <string.h>
#include <stdio.h>

char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;

int main( void )
{
printf( "Tokens:\n" );

// Establish string and get the first token:
token = strtok( string, seps ); // C4996
// Note: strtok is deprecated; consider using strtok_s instead
while( token != NULL )
{
// While there are tokens in "string"
printf( " %s\n", token );

// Get next token:
token = strtok( NULL, seps ); // C4996
}
}
pengzhixi 2010-12-08
  • 打赏
  • 举报
回复
你自己写的函数改个名字吧。
bdmh 2010-12-08
  • 打赏
  • 举报
回复
用C++的strtok(#include <string>),输出为
we
likt
his
bdmh 2010-12-08
  • 打赏
  • 举报
回复
你自己写的strtok?这不是C++的吗

70,029

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧