下一次调用strtok(NULL,)重复当前的调用

时间:2013-10-19 17:16:41

标签: strtok

有没有办法让下一次调用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-

1 个答案:

答案 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一个令牌。