【问题标题】:Split C string into tokens using sscanf使用 sscanf 将 C 字符串拆分为标记
【发布时间】:2012-03-23 15:08:44
【问题描述】:

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

"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 hack:

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, "&");
}

但它不起作用,因为最后 splitted 的 strtok 变成了 gobbldygook。

【问题讨论】:

  • 所以在调用strtok()之前保存字符串的副本。
  • @S.O users 我认为这是一个非常好的问题。除了预测其他方法之外,如果有人解释为什么 sscanf(contents, "%s&%s", arg, value); 会更好。不工作
  • @EAGER_STUDENT 就像我在回答中所说的那样,要求 scanf 扫描 %s 会导致它扫描到下一个空格。所以它不会停在&符号上。

标签: c string c99


【解决方案1】:

scanf 比你想象的更原始——%s 会将所有内容匹配到下一个空格。您最好的解决方案可能是坚持使用strtok,但仅将您从权威原创strduped 中删除的内容扔掉。

【讨论】:

  • 当我尝试将子解析抽象为一个传入 strduped 版本的拆分的新函数时,它失败了。为什么是这样?我已经在上面添加了代码来修复。
【解决方案2】:

我推荐类似以下的内容:

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

【讨论】:

    【解决方案3】:

    这是一个似乎可行的解决方案:

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

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 2013-09-15
      • 1970-01-01
      • 2013-02-09
      • 2020-11-29
      • 2011-01-06
      • 2013-08-21
      • 1970-01-01
      相关资源
      最近更新 更多