2012-03-06 54 views
4

我試圖將字符串拆分爲令牌,但有點遞歸。我試圖解析:使用sscanf將C字符串拆分爲令牌

"content=0&website=Google" 

這樣我就有辦法取出參數和值。如果我嘗試strtok我最終破壞了我想解析兩次的字符串。所以,我想

char *contents = "content=0&website=Google" 
char arg[100]; 
char value[100]; 
sscanf(contents, "%s&%s", arg, value); 

在第一遍,希望再次解析arg,但它失敗,arg包含整個字符串。我嘗試使用"%s\&%s"思想&是一個保留字,但沒有運氣。

幫助!

編輯:

這是我的strtok黑客:

static void readParams(char * string, char * param, char * value) { 
    printf("This is the string %s\n",string); 
    char * splitted = strtok (string,"="); 

    while (splitted != NULL) 
    { 
     printf("This is the string %s\n",splitted); 
     splitted = strtok (NULL, "="); 
     // Then do some saving to param and value 
    } 
} 
char * splitted = strtok (contents,"&"); 
int counter = 0; 

while (splitted != NULL) 
{ 
    char * t_str = strdup(splitted); 
    readParams(t_str, param, value); 
    splitted = strtok (NULL, "&"); 
} 

,但它不工作,因爲分裂的strtok在年底成爲gobbldygook。

+2

使保存的字符串的副本,你叫'的strtok(前)'。 – Duck 2012-03-06 05:59:20

+0

你可以試試'strchr()'。 – 2012-03-06 06:00:21

+0

@ S.O用戶我認爲這是一個非常好的問題。除了預測其他方法之外,如果有人推斷爲什麼sscanf(內容,「%s&%s」,arg,value)會更好。不起作用 – 2012-03-06 06:26:09

回答

1

scanf比你想象的更原始 - %s將匹配所有內容直到下一個空格。您最好的解決方案可能是堅持使用strtok,但只會將其權威原創文章的內容丟到strdup

+0

當我嘗試將子分析抽象爲一個傳入分裂的中間版本的新函數時,它失敗。爲什麼是這樣?我已將代碼添加到上述內容中進行修復。 – Rio 2012-03-06 06:28:03

0

我建議類似以下的東西:

char t_str[100]; 
strncpy(t_str, contents, 100); 
//now strtok() on t_str, original contents will be preserved 
8

這裏,似乎工作的解決方案:

char *contents = "content=0&website=Google"; 
char arg[100] = {0}; 
char value[100] = {0}; 
sscanf(contents, "%[^&]&%s", arg, value); 
printf("%s\n%s\n", arg, value);