C++调用API获取UYU汇率的函数无法捕获汇率值,请求协助排查
C++调用API获取UYU汇率的函数无法捕获汇率值,请求协助排查
看起来你是用libcurl调用汇率API拿UYU的汇率,但没法正确捕获到数值对吧?我从你贴的代码片段和常见的坑点给你梳理几个排查方向:
先确认
WriteMemoryCallback回调函数的实现是否正确。这个函数负责把curl返回的API数据写入到你定义的chunk结构体里,要是实现有问题(比如没正确扩容内存、没给字符串加终止符),后面根本拿不到完整的返回内容。正确的实现应该是这样的:size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp) { size_t realsize = size * nmemb; struct MemoryStruct *mem = (struct MemoryStruct *)userp; char *ptr = realloc(mem->memory, mem->size + realsize + 1); if(!ptr) { printf("内存不足!realloc返回NULL\n"); return 0; } mem->memory = ptr; memcpy(&(mem->memory[mem->size]), contents, realsize); mem->size += realsize; mem->memory[mem->size] = 0; // 必须加字符串终止符,不然后续解析会乱码 return realsize; }检查
MemoryStruct的结构体定义是否正确,得是这种形式:struct MemoryStruct { char *memory; size_t size; };要是结构体成员不对,数据写入直接就错了。
先验证curl是否真的拿到了API返回的内容。在
curl_easy_perform成功的分支里,加一行打印代码:printf("API返回内容:%s\n", chunk.memory);要是打印不出来或者内容是乱码、空的,先排查curl请求的配置:
- 注意你代码里的URL写的是带
"的,实际代码里要换成正常的双引号"https://open.er-api.com/v6/latest/USD",不然curl会把带转义的字符串当成无效URL - 确认
CURLOPT_FOLLOWLOCATION是否开启(你已经设为1L了,这个没问题,防止API有重定向) - 检查
curl_easy_perform的返回值,你已经做了错误处理,但可以再打印一下chunk.size,看看返回的数据长度是不是合理(正常这个API返回的JSON大概几百字节)
- 注意你代码里的URL写的是带
要是已经拿到了完整的JSON内容,那问题就出在解析环节。这个API返回的JSON里,汇率值在
rates字段下的UYU键对应的值,你没贴完的else分支里应该就是解析逻辑:- 如果你是手动字符串查找解析,很容易因为JSON格式的小变化(比如空格、换行)失败,比如找
"UYU":的位置,然后提取后面的数字,记得处理小数和可能的空格 - 更稳妥的方式是用成熟的JSON解析库,比如cJSON或者nlohmann/json,以cJSON为例,解析代码大概是这样:
cJSON *root = cJSON_Parse(chunk.memory); if (!root) { const char *err = cJSON_GetErrorPtr(); if (err) fprintf(stderr, "JSON解析错误:%s\n", err); return 0.0; } cJSON *rates_node = cJSON_GetObjectItemCaseSensitive(root, "rates"); cJSON *uyu_rate_node = cJSON_GetObjectItemCaseSensitive(rates_node, "UYU"); if (cJSON_IsNumber(uyu_rate_node)) { exchangeRate = uyu_rate_node->valuedouble; } cJSON_Delete(root); // 记得释放JSON对象
手动解析的话可以试试用
strstr定位"UYU":,然后跳过冒号和可能的空格,用atof或者strtod转成double:char *uyu_pos = strstr(chunk.memory, "\"UYU\":"); if (uyu_pos) { uyu_pos += strlen("\"UYU\":"); // 跳过空格 while (*uyu_pos == ' ') uyu_pos++; exchangeRate = strtod(uyu_pos, NULL); }- 如果你是手动字符串查找解析,很容易因为JSON格式的小变化(比如空格、换行)失败,比如找
最后别忘了在函数结束前释放
chunk.memory,避免内存泄漏:free(chunk.memory); curl_easy_cleanup(curl); curl_global_cleanup();
你可以先从打印返回内容开始排查,一步步定位是请求环节没拿到数据,还是解析环节出了问题。
备注:内容来源于stack exchange,提问作者Alejandro Caro
相关产品推荐
相关产品推荐

