我試圖找到一個字符串中的模式,並刪除它,如果它存在。我一直在玩strtok(aString, "$%");
strtok基於char *(字符串)而不是單個字符
這將打破aString
當它發現$
或%
。當它只在字符串中找到"$%"
時,我該如何讓它分解?
我試圖找到一個字符串中的模式,並刪除它,如果它存在。我一直在玩strtok(aString, "$%");
strtok基於char *(字符串)而不是單個字符
這將打破aString
當它發現$
或%
。當它只在字符串中找到"$%"
時,我該如何讓它分解?
您可以輕鬆地創建的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;
}
解析結果不好。我也沒有得到初始化... – glglgl
對不起題外話。
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;
}
沒辦法,寫你自己的代碼。使用'strstr'來定位字符串的出現,然後將它複製到新的緩衝區(或同一個緩衝區)。 – nhahtdh
當你說「刪除它,如果它存在」,你的意思是修剪出模式,並將所有向前的數據移回到由兩個字符開始的字符串,尾部填充0? – WhozCraig