現在、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 回目は機能しないのですか?