2012-11-27 49 views
1

我試圖找到一個字符串中的模式,並刪除它,如果它存在。我一直在玩strtok(aString, "$%");strtok基於char *(字符串)而不是單個字符

這將打破aString當它發現$%。當它只在字符串中找到"$%"時,我該如何讓它分解?

+1

沒辦法,寫你自己的代碼。使用'strstr'來定位字符串的出現,然後將它複製到新的緩衝區(或同一個緩衝區)。 – nhahtdh

+0

當你說「刪除它,如果它存在」,你的意思是修剪出模式,並將所有向前的數據移回到由兩個字符開始的字符串,尾部填充0? – WhozCraig

回答

0

您可以輕鬆地創建的strstr此:

char *strtok2(char *str, const char *pattern) { 
    static char *save = NULL; 
    if(str == NULL) 
     str = save; 
    if(str == NULL) 
     return NULL; 
    if((save=strstr(str, pattern))) { 
     save[0]=0; 
     save += strlen(pattern); 
    } 
    return str; 
} 
+0

解析結果不好。我也沒有得到初始化... – glglgl

0

對不起題外話。

strtok不是線程安全的。你不能在同一部分使用strtok作爲其他值。所以你不應該使用。 strtok不難寫在你自己。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int 
main(int argc, char* argv[]) { 
    char* p = "$%"; 
    size_t pl = strlen(p); 
    char* s = "hello$%C$%language$%world"; 
    char* pp = s; 
    while (pp && *pp) { 
    char* pn = strstr(pp, p); 
    if (!pn) pn = pp + strlen(pp); 
    size_t l = pn - pp; 
    char* ss = malloc(l + 1); 
    *(ss + l) = 0; 
    memcpy(ss, pp, l); 

    // do something with ss 
    puts(ss); 

    free(ss); 
    pp = pn + pl; 
    } 
    return 0; 
}