描述 要求将URL请求参数,按照指定格式输出。 输入描述 1. URL请求参数格式为:a=xxx&b=xxx(不考虑xxx包含“=”的场景,但其值可能为空字符串) 2. 参数类型均为字符串类型(其他类型均以字符串类型考虑) 输出描述 1. 需要将请求参数解析成kv形式,不同kv之间使用“;”拼接(例如:"a=1&b=2" 输出为 "k=a,v=1;k=b,v=2") 2. 结果按照"k=xxx,v=xxx"字符串升序排序 3. 参数重复需要过滤(例如: "a=1&a=1" 输出为 "k=a,v=1") 4. 参数值为空字符串,需要过滤(例如: "a=&b=2" 输出为 "k=b,v=2")。使用C语言实现
时间: 2024-02-17 20:00:16 浏览: 259
SpringBoot2.1.3修改tomcat参数支持请求特殊符号问题
以下是C语言实现的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct KeyValue {
char* key;
char* value;
} KeyValue;
int compare(const void* a, const void* b) {
KeyValue* ka = (KeyValue*)a;
KeyValue* kb = (KeyValue*)b;
return strcmp(ka->key, kb->key);
}
void parseParams(const char* params, KeyValue* kv, int* kvCount) {
char* str = strdup(params);
char* token = strtok(str, "&");
while (token != NULL) {
char* key = strtok(token, "=");
char* value = strtok(NULL, "=");
if (key != NULL && value != NULL && strlen(value) > 0) {
int found = 0;
for (int i = 0; i < *kvCount; i++) {
if (strcmp(kv[i].key, key) == 0) {
found = 1;
break;
}
}
if (!found) {
kv[*kvCount].key = key;
kv[*kvCount].value = value;
(*kvCount)++;
}
}
token = strtok(NULL, "&");
}
free(str);
}
void printParams(const KeyValue* kv, int kvCount) {
qsort(kv, kvCount, sizeof(KeyValue), compare);
for (int i = 0; i < kvCount; i++) {
printf("k=%s,v=%s;", kv[i].key, kv[i].value);
}
}
int main() {
const char* params = "a=xxx&b=yyy&c=zzz&a=vvv&d=";
KeyValue kv[10];
int kvCount = 0;
parseParams(params, kv, &kvCount);
printParams(kv, kvCount);
return 0;
}
```
代码中使用了结构体 `KeyValue` 存储每个参数的键值对,`parseParams` 函数解析输入的参数字符串,过滤重复和空值,将有效的参数存储到 `KeyValue` 数组中,`printParams` 函数将数组按照升序排序后输出。
阅读全文