我需要解析這樣一個字符串:記號化與特定的多字節分隔字符串
link:a link:blink:c link:d lkjh
輸出應該a
,blink:c
,d
但使用strtok
輸出understably是a
,b
,c
, d
,jh
我如何確保只有link:
明確拆分字符串(避免blink:c
分裂的情況。 另外我如何確保最後的kjh
不會出現(k似乎是這裏的分隔符)。
我需要解析這樣一個字符串:記號化與特定的多字節分隔字符串
link:a link:blink:c link:d lkjh
輸出應該a
,blink:c
,d
但使用strtok
輸出understably是a
,b
,c
, d
,jh
我如何確保只有link:
明確拆分字符串(避免blink:c
分裂的情況。 另外我如何確保最後的kjh
不會出現(k似乎是這裏的分隔符)。
首先,傳遞一個分隔符字符串到strtok
不會做你認爲的事情。如果您通過"link:"
作爲delim
字段,它將使用這些字符的任意作爲分隔符。這就是爲什麼lkjh
被拆分並返回jh
。
你最好用空格分開,然後檢查開頭匹配"link:"
。
const char * delim = " ";
const char * prefix = "link:";
const size_t len_prefix = strlen(prefix);
char * token = strtok(input_string, delim);
while(token != NULL) {
if(0 == strncmp(token, prefix, len_prefix)
{
printf("%s\n", token + len_prefix);
}
token = strtok(NULL, delim);
}
如果您需要比此更復雜的事情,請自行打印或使用正則表達式。
嗨,爲什麼要打印printf(「%s \ n」,token + len_prefix); ?我不明白需要連接這個。 我的理解是,你是否已經獲得空間分割標記,現在正在比較前5個字符是否等於鏈接:然後嘗試打印其餘的部分。這是正確的嗎? –
這是正確的。前綴後面的字符串的其餘部分從'token + len_prefix'開始。這是指針算術,而不是連接。你可以用它做你想做的。將它複製到某處或其他地方。在這種情況下,我只是把它打印出來。 – paddy
回答我自己的問題。
基本上找到第一個鏈接:然後繼續前進,直到下一個空格/ null,並重復字符串剩餘。
更好的方法是簡單地使用的strstr: -
char* parseSubFn(char *string)
{
if(string==NULL || *string=='\0')
return;
else{
//printf("Parsing on %s \n",string);
const char* needle = "link:";
char ret[128];//large buffer character for return token
char *location=strstr(string,needle);
char *start=location+5;
int i=0;
while(*start!='\0' && *start!='\n' && *start!=' ')
{
ret[i]=*start;
start++;i++;
}
start++;
printf("%s\n",ret);
parseSubFn(start);
}
}
在我看來,輸入可能需要被解析爲「鏈接:B鏈接: c「而不是」blink:c「。你確定你的要求嗎? – kaylum
您的要求至少不清楚。如果你願意,只需'link:'分割字符串,然後'link:b'' link:c'將會是並且應該是兩個不同的標記。另一方面,如果你想'link:'(用一個前導空格)來分割字符串,那麼第一個標記將是'link:a',因爲它缺少前導空間。你應該澄清一下你真正想要的是什麼。 – Dolda2000
@kaylum,我敢肯定,它需要輸出「blink:c」 –