strtok和strtok_r [英] strtok and 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屋!