2016-04-13 57 views
1

我需要解析這樣一個字符串:記號化與特定的多字節分隔字符串

link:a link:blink:c link:d lkjh

輸出應該ablink:cd

但使用strtok輸出understably是a,b,c, d,jh

我如何確保只有link:明確拆分字符串(避免blink:c分裂的情況。 另外我如何確保最後的kjh不會出現(k似乎是這裏的分隔符)。

+1

在我看來,輸入可能需要被解析爲「鏈接:B鏈接: c「而不是」blink:c「。你確定你的要求嗎? – kaylum

+1

您的要求至少不清楚。如果你願意,只需'link:'分割字符串,然後'link:b'' link:c'將會是並且應該是兩個不同的標記。另一方面,如果你想'link:'(用一個前導空格)來分割字符串,那麼第一個標記將是'link:a',因爲它缺少前導空間。你應該澄清一下你真正想要的是什麼。 – Dolda2000

+0

@kaylum,我敢肯定,它需要輸出「blink:c」 –

回答

4

首先,傳遞一個分隔符字符串到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); 
} 

如果您需要比此更復雜的事情,請自行打印或使用正則表達式。

+0

嗨,爲什麼要打印printf(「%s \ n」,token + len_prefix); ?我不明白需要連接這個。 我的理解是,你是否已經獲得空間分割標記,現在正在比較前5個字符是否等於鏈接:然後嘗試打印其餘的部分。這是正確的嗎? –

+0

這是正確的。前綴後面的字符串的其餘部分從'token + len_prefix'開始。這是指針算術,而不是連接。你可以用它做你想做的。將它複製到某處或其他地方。在這種情況下,我只是把它打印出來。 – paddy

0

回答我自己的問題。

基本上找到第一個鏈接:然後繼續前進,直到下一個空格/ 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); 
    } 

}