1

現在、URL クエリを解析するパーサーを作成していますkey1=value1&key2=value2。最初のパラメーターを取り出しますが、2 番目のパラメーターは死んでしまいます。これが私が使用する簡素化されたコードです:

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が私が期待していることだと思いますが、なぜこの手法は最初の反復でのみ機能し、2 回目は機能しないのですか?

4

2 に答える 2

2

ガネーシャの言うことに加えて、ラインに問題があることがわかりますvalue_str_len = tmp - strchr(tmp, '&') + 1;。まず、strchrを超えるアンパサンドを見つける必要がありますtmpが、そのポインター値 (通常は大きい方) をtmp(小さい方) から減算すると、負の長さにつながる可能性があります。第二に、アンパサンドが見つからないケースを処理しません。はい、解析はトリッキーです。幸運を。

于 2013-04-11T00:23:27.587 に答える
1

query_strconst char *であるため、key = strchr(query_str, '&') + 1;失敗します。

于 2013-04-11T00:19:00.887 に答える