strtok和strtok_r [英] strtok and strtok_r

查看:52
本文介绍了strtok和strtok_r的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

亲爱的专家,


我知道strtok_r是strtok的重入版本。

strtok_r()用s1调用(比如说)它的第一个参数。

来自s1的剩余标记是通过调用strtok_r()获得第一个参数的

空指针获得的。

我的困惑是这个行为与strtok相同。所以我假设

strtok_r也必须使用任何函数静态变量来保存关于s1的

信息。如果是这种情况那么strtok_r是如何重新进入
进入者?

否则它如何保存有关s1的信息?


此致,

Siddharth

Dear experts,

As I know strtok_r is re-entrant version of strtok.
strtok_r() is called with s1(lets say) as its first parameter.
Remaining tokens from s1 are obtained by calling strtok_r() with a
null pointer for the first parameter.
My confusion is that this behavior is same as strtok. So I assume
strtok_r must also be using any function static variable to keep the
information about s1. If this is the case then how strtok_r is re-
entrant?
Otherwise how it keeps the information about s1?

Regards,
Siddharth

推荐答案

siddhu写道:
siddhu wrote:

尊敬的专家,


我知道strtok_r是strtok的重入版本。

strtok_r()用s1调用(让我们说)作为它的第一个参数。

s1的剩余标记是通过调用strtok_r()和第一个参数的

空指针获得的。

我的困惑是这种行为和strtok一样。所以我假设

strtok_r也必须使用任何函数静态变量来保存关于s1的

信息。如果是这种情况那么strtok_r是如何重新进入
进入者?

否则它如何保存有关s1的信息?


问候,

Siddharth
Dear experts,

As I know strtok_r is re-entrant version of strtok.
strtok_r() is called with s1(lets say) as its first parameter.
Remaining tokens from s1 are obtained by calling strtok_r() with a
null pointer for the first parameter.
My confusion is that this behavior is same as strtok. So I assume
strtok_r must also be using any function static variable to keep the
information about s1. If this is the case then how strtok_r is re-
entrant?
Otherwise how it keeps the information about s1?

Regards,
Siddharth



重入版本需要再多一个参数来存储它的进度:
http:// www。 bullfreeware.com/download...-1.0.9/support

//跳过GNU版权

#include< string.h>

/ *将S解析为由DELIM中的字符分隔的标记。

如果S为NULL,SAVE_PTR中保存的指针将用作下一个起点的

。例如:

char s [] =" -abc - = - def" ;;

char * sp;

x = strtok_r(s , - ",& sp); // x =" abc",sp =" = - def"

x = strtok_r(NULL," - =",& sp); // x =" def",sp = NULL

x = strtok_r(NULL," =",& sp); // x = NULL

// s =" abc \-def -\\0"

* /

char * strtok_r (char * s,

const char * delim,

char ** save_ptr)

{

char *令牌;


if(s == NULL)

s = * save_ptr;


/ *扫描前导分隔符。 * /

s + = strspn(s,delim);

if(* s ==''\''')

返回NULL;


/ *查找令牌的结尾。 * /

token = s;

s = strpbrk(token,delim);

if(s == NULL)

/ *此令牌完成字符串。 * /

* save_ptr = strchr(令牌,''\''');

其他

{

/ *终止令牌并使* SAVE_PTR指向它。 * /

* s =''\ 0'';

* save_ptr = s + 1;

}

返回令牌;

}

The reentrant version takes one more argument where it stores its progress:
http://www.bullfreeware.com/download...-1.0.9/support
// Skip GNU copyright
#include <string.h>
/* Parse S into tokens separated by characters in DELIM.
If S is NULL, the saved pointer in SAVE_PTR is used as
the next starting point. For example:
char s[] = "-abc-=-def";
char *sp;
x = strtok_r(s, "-", &sp); // x = "abc", sp = "=-def"
x = strtok_r(NULL, "-=", &sp); // x = "def", sp = NULL
x = strtok_r(NULL, "=", &sp); // x = NULL
// s = "abc\0-def\0"
*/
char *strtok_r (char *s,
const char *delim,
char **save_ptr)
{
char *token;

if (s == NULL)
s = *save_ptr;

/* Scan leading delimiters. */
s += strspn (s, delim);
if (*s == ''\0'')
return NULL;

/* Find the end of the token. */
token = s;
s = strpbrk (token, delim);
if (s == NULL)
/* This token finishes the string. */
*save_ptr = strchr (token, ''\0'');
else
{
/* Terminate the token and make *SAVE_PTR point past it. */
*s = ''\0'';
*save_ptr = s + 1;
}
return token;
}


siddhu< si *********** @ gmail.comwrites:
siddhu <si***********@gmail.comwrites:

我知道strtok_r是strtok的重入版本。
As I know strtok_r is re-entrant version of strtok.



这在符合例如POSIX的系统上是正确的,但是C.后续设置不需要它是
。 />

This is true on a system compliant with, e.g., POSIX, but it is
not required by C. Followups set.


[...误解...]
[...misunderstanding...]



我认为问题在于你没有意识到strtok_r

比strtok多一个参数,并使用该参数

从一次调用到下一次调用保存状态。

-

char a [] =" \ n .CJacehknorstu" ;; int putchar(int); int main(void){unsigned long b []

= {0x67dffdff,0x9aa9aa6a ,0xa77ffda9,0x7da6aa6a,0xa6 7f6aaa,0xaa9aa9f6,0x11f6},* p

= b,i = 24; for(; p + =!* p; * p / = 4)switch(0 [p ]& 3)case 0:{return 0; for(p - ; i - ; i - )case +

2:{i ++; if(i)break; else default:continue ; if(0)case 1:putchar(a [i& 15]); break;}}}

I think the problem is that you do not realize that strtok_r
takes one more parameter than strtok, and uses that parameter to
save state from one call to the next.
--
char a[]="\n .CJacehknorstu";int putchar(int);int main(void){unsigned long b[]
={0x67dffdff,0x9aa9aa6a,0xa77ffda9,0x7da6aa6a,0xa6 7f6aaa,0xaa9aa9f6,0x11f6},*p
=b,i=24;for(;p+=!*p;*p/=4)switch(0[p]&3)case 0:{return 0;for(p--;i--;i--)case+
2:{i++;if(i)break;else default:continue;if(0)case 1:putchar(a[i&15]);break;}}}


" siddhu" < si *********** @gmail.comaécritdansle message de news:
11 ********************** @ g4g2000hsf.googlegroups.c om ...
"siddhu" <si***********@gmail.coma écrit dans le message de news:
11**********************@g4g2000hsf.googlegroups.c om...

尊敬的专家,


据我所知,strtok_r是strtok的重入版本。

strtok_r()用s1(比如说)作为第一个参数调用。

s1的剩余标记是通过调用带有

的strtok_r()获得的第一个参数的空指针。

我的困惑是这个行为和strtok一样。所以我假设

strtok_r也必须使用任何函数静态变量来保存关于s1的

信息。如果是这种情况那么strtok_r如何重新进入
进入者?

否则它如何保存有关s1的信息?
Dear experts,

As I know strtok_r is re-entrant version of strtok.
strtok_r() is called with s1(lets say) as its first parameter.
Remaining tokens from s1 are obtained by calling strtok_r() with a
null pointer for the first parameter.
My confusion is that this behavior is same as strtok. So I assume
strtok_r must also be using any function static variable to keep the
information about s1. If this is the case then how strtok_r is re-
entrant?
Otherwise how it keeps the information about s1?



strtok_r需要一个额外的参数,q指向一个char *,它存储它的

当前状态。

实现非常简单:


char * strtok_r(char * str,const char * delim,char ** nextp)

{

char * ret;


if(str == NULL)

str = * nextp;

str + = strspn(str,delim);

if(* str ==''\''')

返回NULL;

ret = str;

str + = strcspn(str,delim);

if(* str)

* str ++ =' '\0'';

* nextp = str;

返回ret;

}


-

Chqrlie。

strtok_r takes an extra parameter, q pointer to a char * where it stores its
current state.

The implementation is quite straightforward:

char *strtok_r(char *str, const char *delim, char **nextp)
{
char *ret;

if (str == NULL)
str = *nextp;
str += strspn(str, delim);
if (*str == ''\0'')
return NULL;
ret = str;
str += strcspn(str, delim);
if (*str)
*str++ = ''\0'';
*nextp = str;
return ret;
}

--
Chqrlie.


这篇关于strtok和strtok_r的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆