使用sscanf将C字符串拆分为标记

时间:2012-03-06 05:55:32

标签: c string c99

我正在尝试将字符串拆分为标记但有些递归。我想解析:

"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"认为&是一个保留字,但没有运气。

帮助!

编辑:

这是我的愚蠢行为:

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。

3 个答案:

答案 0 :(得分:9)

这是一个似乎有效的解决方案:

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);

答案 1 :(得分:1)

scanf比您想象的更原始 - %s将匹配下一个空格的所有内容。您最好的解决方案可能是坚持使用strtok,但只提供您从权威原件中strdup编辑的内容。

答案 2 :(得分:0)

我推荐类似以下的内容:

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