2010-01-19 15 views
7

如何在C中使用'&'將字符串拆分爲令牌?如何將字符串拆分爲C中的標記?

+1

http://stackoverflow.com/questions/266357/tokenizing-strings-in-c – 2010-01-19 07:32:05

+0

貌似這個問題是關於拆分一個字符串(雖然問題是低的細節,稱「不工作」)。這可能或不可能是OP想要的。我們應該給他一個解釋的機會。字符串是否被分割爲文字字符串,還是隻讀? – 2010-01-19 07:38:56

回答

10

strtok/strtok_r

char *token; 
char *state; 

for (token = strtok_r(input, "&", &state); 
    token != NULL; 
    token = strtok_r(NULL, "&", &state)) 
{ 
    ... 
} 
6

我會做這樣的事情(使用strchr()):

#include <string.h> 

char *data = "this&&that&other"; 
char *next; 
char *curr = data; 
while ((next = strchr(curr, '&')) != NULL) { 
    /* process curr to next-1 */ 
    curr = next + 1; 
} 
/* process the remaining string (the last token) */ 

strchr(const char *s, int c)返回一個指向的c的下一個位置s,或NULL如果c ISN」 t在s中找到。

您可能能夠使用strtok(),但是,我不喜歡strtok(),因爲:

  • 它修改字符串被標記化,所以它不會對文本字符串的工作,或者是不是很當你想保留字符串用於其他目的時很有用。在這種情況下,您必須首先將字符串複製到臨時文件中。
  • 它合併了相鄰的分隔符,所以如果您的字符串是"a&&b&c",返回的標記是"a","b""c"。請注意,在"a"之後沒有空標記。
  • 它不是線程安全的。
+0

我想這也取決於C的實現。在我的系統中,當我調用strtok()時,字符串本身沒有被修改。其實我甚至都沒有看到它是如何的。畢竟它只是產生指向字符串內不同標記開始的指針。 – 2010-01-19 10:43:20

+0

Cees Meijer:'strtok()* *修改參數字符串 - 分隔符被替換爲'\ 0',以便返回的字符串被正確終止。 – caf 2010-01-19 10:58:52

+1

'strtok' *具有*修改字符串,如果它必須符合標準。從C標準:*如果找到這樣一個字符,它將被空字符覆蓋,這會終止當前標記*。這非常明確。 http://opengroup.org/onlinepubs/009695399/functions/strtok.html。你可以在'strtok()'不修改字符串的地方發佈代碼嗎? – 2010-01-19 10:59:42

2

您可以使用strok()函數,如下例所示。

/// Function to parse a string in separate tokens 

int parse_string(char pInputString[MAX_STRING_LENGTH],char *Delimiter, 
        char *pToken[MAX_TOKENS]) 
{ 
    int i; 
    i = 0; 

    pToken[i] = strtok(pInputString, Delimiter); 
    i++; 

    while ((pToken[i] = strtok(NULL, Delimiter)) != NULL){ 
    i++; 
    } 
    return i; 
} 

/// The array pTokens[] now contains the pointers to the start of each token in the (unchanged) original string. 

sprintf(String,"Token1&Token2"); 
NrOfParameters = parse_string(String,"&",pTokens); 

sprintf("%s, %s",pToken[0],pToken[1]);