2012-03-06 97 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);