下面函数中 最后一个参数是必须的吗 如果只要前面两个参数 怎么修改char *addSignToJson(char *jsonString, char *key, char *signKey) { cJSON *json = cJSON_Parse(jsonString); int count = cJSON_GetArraySize(json); char **keys = (char **) malloc(count * sizeof(char *)); int i = 0; cJSON_ArrayForEach(json, json) { keys[i++] = strdup(json->string); } qsort(keys, count, sizeof(char *), strcmp); char *sortString = (char *) malloc(1); sortString[0] = '\0'; for (int i = 0; i < count; i++) { cJSON *item = cJSON_GetObjectItemCaseSensitive(json, keys[i]); if (item->type == cJSON_Object) { char *subSortString = sortJsonString(item); sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(subSortString) + 3); sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], subSortString); free(subSortString); } else { sortString = (char *) realloc(sortString, strlen(sortString) + strlen(keys[i]) + strlen(item->valuestring) + 3); sprintf(sortString + strlen(sortString), "%s=%s&", keys[i], item->valuestring); } } sortString[strlen(sortString) - 1] = '\0'; unsigned char *hmac = HMAC(EVP_sha256(), key, strlen(key), (const unsigned char *) sortString, strlen(sortString), NULL, NULL); char *sign = (char *) malloc(65); for (int i = 0; i < 32; i++) { sprintf(&sign[i * 2], "%02x", hmac[i]); } sign[64] = '\0'; cJSON_AddStringToObject(json, signKey, sign); char *result = cJSON_Print(json); for (int i = 0; i < count; i++) { free(keys[i]); } free(keys); free(sortString); cJSON_Delete(json); free(sign); return result; }
时间: 2024-01-21 13:02:27 浏览: 17
最后一个参数不是必须的,如果只要前面两个参数,可以将函数定义修改为如下形式:
```
char *addSignToJson(char *jsonString, char *key) {
// 函数体不变
}
```
然后在函数体中,不再需要签名的 key 时,可以直接使用一个默认的字符串或者直接将这个参数忽略掉。
相关问题
将下面代码中函数的地一个参数输入变为指向json字符串的char指针 函数最后输出也是指向json字符串的char指针
为了将函数的第一个参数输入变为指向json字符串的char指针,并且使函数最后输出也是指向json字符串的char指针,需要进行如下修改:
```c
char *sort_json(char *json_str, char *key, unsigned char *secret_key) {
cJSON *json = cJSON_Parse(json_str);
cJSON *child;
int i;
int size = cJSON_GetArraySize(json);
char *key_value[MAX_KEY_VALUE_LEN];
char *stringA;
char *signature;
// 按ASCII码从小到大排序
for (i = 0; i < size; i++) {
child = cJSON_GetArrayItem(json, i);
key_value[i] = cJSON_PrintUnformatted(child);
}
qsort(key_value, size, sizeof(char *), strcmp);
// 拼接成stringA
stringA = (char *)malloc(size * MAX_KEY_VALUE_LEN);
for (i = 0; i < size; i++) {
strcat(stringA, key_value[i]);
if (i != size - 1) {
strcat(stringA, "&&");
}
}
// 使用HmacSHA256算法签名
unsigned int len = strlen(stringA);
signature = (char *)malloc(len * 2 + 1);
memset(signature, 0, len * 2 + 1);
HMAC(EVP_sha256(), secret_key, strlen(secret_key), (unsigned char *)stringA, len, (unsigned char *)signature, &len);
// 将计算得到的签名作为一个新的参数,合并到json字符串中
cJSON_AddStringToObject(json, "sign", signature);
char *new_json_str = cJSON_Print(json);
// 释放内存
free(stringA);
free(signature);
cJSON_Delete(json);
return new_json_str;
}
```
修改后的函数中,第一个参数变为指向json字符串的char指针。首先需要将输入的json字符串解析成cJSON对象,然后进行相同的操作,最后将新的json对象转换成json字符串并输出,最终函数返回一个指向json字符串的char指针。
如果不是必须的,该怎么使用这个函数,最后一个参数要怎么赋值
如果不需要使用最后一个参数,可以直接将其置为NULL,例如:
```
char *result = addSignToJson(jsonString, key, NULL);
```
在函数内部,可以使用以下方式判断是否需要使用最后一个参数:
```
if (signKey != NULL) {
// 需要使用最后一个参数
} else {
// 不需要使用最后一个参数
}
```
这样就可以灵活使用这个函数了。