2013-10-19 22 views
0

有沒有一種方法,使下一次調用strtok()重複當前的回報?在進行下一步調用strtok(NULL)重複當前一個

要在某種意義上將其推回至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

嗯,我有一個工作的解決方案,但我只寫了兩個答案,他們得到了0票,我不再被允許寫答案。當我可以再次回答問題時,我會發布它。 – user1488660

回答

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); } 

以上要求具有精確的strtok返回的最後一個令牌調用unstrtok,並且只能unstrtok單個令牌。

+0

Offtopic:這是一個非常不同的風格梅開二度 – vidit

+0

@vidit:沒有什麼不同 - 它的「縮進」梅開二度風格 - 縮進顯示了結構和括號就在那裏(上漲到行的結尾),使編譯器明白它。讀者可以忽略大括號。 –

+0

似乎你喜歡Python :) – vidit

相關問題