1

我目前正在编写一个解析器来解析一个 URL 查询,例如key1=value1&key2=value2. 我得到第一个参数,但在第二个,它死了。这是我使用的精简代码:

const char *query_str = "key1=&key2=value2"
char *tmp, *value, *key;
int no_of_params = 2, value_str_len;
key = strdup(query_str);
for(; no_of_params > 0; no_of_params--)
{
    tmp = strchr(key, '=');
    printf("Currently at: %s/%s\n", key, tmp);
    *tmp = '\0';
    printf("Currently at: %s/%s\n", key, tmp);
    tmp = tmp + 1;
    value_str_len = tmp - strchr(tmp, '&') + 1;
    value = malloc(value_str_len);
    strncpy(value, tmp, value_str_len - 1);
    value[value_str_len - 1] = '\0';
    printf("Adding Key '%s' and Value '%s'\n", key, value);
    free(value);

    key = strchr(query_str, '&') + 1;
}

我希望我已经正确调整了一切。这实际上是一个更大函数的一部分,但它应该类似于我使用的代码。这是运行它时的输出:

Currently at: key1=&key2=value2/=&key2=value2
Currently at: key1/
Adding...
Adding Key 'key1' and Value ''
Currently at: key2=value2/=value2

然后发生分段错误。所以这显然是一条线*tmp = '\0',但为什么呢?(注意,在实际代码中,我flush(stdout)每次打印后,所以我现在是这一行。)

我假设自从我之前的printf工作以来,这tmp就是我所期望的,但为什么这种技术只适用于第一次迭代而不适用于第二次?

4

2 回答 2

2

除了 Ganesh 所说的之外,我还看到了这条线的问题value_str_len = tmp - strchr(tmp, '&') + 1;。首先,strchr应该找到超出的与tmp号,但是从(较小的)中减去该指针值(通常会较大)tmp,可能会导致负长度。其次,您不处理没有找到&符号的情况。是的,解析很棘手。祝你好运。

于 2013-04-11T00:23:27.587 回答
1

query_str is of type const char * and hence, key = strchr(query_str, '&') + 1; will fail.

于 2013-04-11T00:19:00.887 回答