You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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大概几百字节)
  • 要是已经拿到了完整的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);
    }
    
  • 最后别忘了在函数结束前释放chunk.memory,避免内存泄漏:

    free(chunk.memory);
    curl_easy_cleanup(curl);
    curl_global_cleanup();
    

你可以先从打印返回内容开始排查,一步步定位是请求环节没拿到数据,还是解析环节出了问题。

备注:内容来源于stack exchange,提问作者Alejandro Caro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 11:19:38