0

有没有办法进行下一次调用以strtok()重复当前返回?

在某种意义上将它推回strtok(NULL,)堆栈?

我在递归中,通过几个级别的长开关情况,其中一个特殊情况让我需要在now之前做额外的事情,所以我做它们然后递归。问题是我需要将当前返回从堆栈strtok(NULL,"delim")中推回,以便递归调用时再次获取它strtok(NULL,"delim")

我可以围绕它进行编程,但它不像我可以 un-strtok() 一次那样简单或可读。

这是我的意思的一个简单示例。un-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-
4

1 回答 1

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使用一个令牌。

于 2013-10-19T21:02:55.423 回答