0

strtok()現在のリターンを繰り返すために次の呼び出しを行う方法はありますか?

ある意味でそれをstrtok(NULL,)スタックにプッシュするには?

私は再帰中で、長いスイッチケースのいくつかのレベルを下ります.特別なケースではまでに余分なことをする必要があるので、それらを実行してから再帰します. 問題は、再帰が呼び出されたときに再帰が再び取得されるように、現在のリターンをスタックstrtok(NULL,"delim")にプッシュする必要があることですstrtok(NULL,"delim")

私はこれを回避するようにプログラムすることができましたが、strtok() を一度 un-strtok() できるかのように単純でもなく、読みやすくもありません。

これが私が言いたいことの簡単な例です。unstrtok()

/* 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、 によって返された最後のトークンを正確に使用して呼び出す必要があり、1 つのトークンstrtokしか使用できませんunstrtok

于 2013-10-19T21:02:55.423 に答える