有没有办法让下一次调用strtok()
重复当前的回报?
从某种意义上说,将它推回strtok(NULL,)
堆栈?
我正在递归,通过几个级别的长开关案例,其中一个特殊情况让我需要在现在之前做额外的事情,所以我做了然后然后递归。问题是我需要在堆栈上推送strtok(NULL,"delim")
返回的当前返回值,以便在递归调用strtok(NULL,"delim")
我可以围绕这个进行编程,但它不像我可以un-strtok()一样简单或可读。
这是我的意思的一个简单例子。 未的strtok()
/* UN-strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char tok[] =" ,.-";
char * pch;
int i=0;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str,tok);
while (pch != NULL)
{
printf ("%s\n",pch);
if (i==1) {
//un_strtok(NULL,tok);
}
i++;
pch = strtok (NULL, tok);
}
return 0;
}
它会返回:
Splitting string "- This, a sample string." into tokens:
This
a
sample
string
-Done-
如果un_strtok()有效,它会给出:
Splitting string "- This, a sample string." into tokens:
This
a
a
sample
string
-Done-
答案 0 :(得分:1)
好吧,如果你自己编写strtok
,那很容易做到。以下是实施strtok
的常用方法:
char *strtok_r(char *str, const char *delim, char **save) {
if (!str) str = *save;
char *rv = str + strspn(str, delim);
if (*rv) {
str = rv + strcspn(rv, delim);
if (*str) *str++ = 0;
*save = str;
return rv; }
return 0; }
static char *strtok_save;
char *strtok(char *str, const char *delim) {
return strtok_r(str, delim, &strtok_save); }
通过上述内容,您可以将unstrtok写为:
void unstrtok_r(char *tok, char *delim, char **save) {
if (*save) *--save = *delim;
*save = tok; }
void unstrtok(char *tok, char *delim) {
unstrtok_r(tok, delim, &strtok_save); }
以上内容需要使用unstrtok
返回的最后一个令牌来调用strtok
,并且您只能unstrtok
一个令牌。