Linux下C语言调用libcurl库获取天气预报信息

news2025/2/12 3:51:57

一、概述

当前文章介绍如何在Linux(Ubuntu)下使用C语言调用libcurl库获取天气预报的方法。通过HTTP GET请求访问百度天气API,并解析返回的JSON数据,可以获取指定城市未来7天的天气预报信息。

image-20230626103811318

image-20230626103835548

二、设计思路

【1】使用libcurl库进行HTTP GET请求

  • 在代码中包含<curl/curl.h>头文件,以便使用libcurl库
  • 使用curl_easy_init()函数初始化curl
  • 设置请求选项,包括URL、写回调函数和写数据参数
  • 使用curl_easy_perform()函数执行请求

【2】编写回调函数,将响应数据存储在内存中

  • 定义一个结构体,包含存储响应数据的指针和长度
  • 在回调函数中将响应数据拷贝到内存中,并动态调整内存大小
  • 返回已拷贝的数据大小

【3】解析JSON数据

  • 使用json_tokener_parse()函数解析返回的JSON数据
  • 使用json_object_object_get_ex()函数获取指定字段的值
  • 使用json_object_array_length()函数获取数组长度
  • 使用json_object_array_get_idx()函数获取数组中的元素
  • 使用json_object_get_string()函数获取字符串值

【4】打印天气预报信息

  • 遍历获取到的天气预报数据,依次获取日期、天气和温度
  • 使用printf()函数打印每一天的天气预报信息

三、关键代码

以下是主要的代码片段:

// 定义回调函数,用于将响应数据存储在内存中
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    // ...
}

// 子函数,用于获取指定城市未来7天的天气预报
int get_weather_forecast(const char *city) {
    // ...
}

int main() {
    const char *city = "your_city_code";
    int ret = get_weather_forecast(city);
    // ...
}

四、使用说明

【1】替换API密钥和城市代码:在示例代码中,将your_akyour_city_code替换为你自己的百度API密钥和城市代码。

【2】编译代码:使用合适的C编译器,如gcc,编译代码。

gcc -o download_program download_program.c -lcurl

【3】运行代码:在终端中运行生成的可执行文件。

./download_program

【4】查看天气预报:程序会打印出指定城市未来7天的天气预报信息。

五、完整代码

HTTP GET请求访问百度天气API,并解析返回的JSON数据获取需要的天气信息。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>
#include <json-c/json.h>

// 定义回调函数,用于将响应数据存储在内存中
size_t write_callback(void *ptr, size_t size, size_t nmemb, void *stream) {
    size_t realsize = size * nmemb;
    struct string *mem = (struct string *)stream;

    mem->ptr = realloc(mem->ptr, mem->len + realsize + 1);
    if (mem->ptr == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 0;
    }

    memcpy(&(mem->ptr[mem->len]), ptr, realsize);
    mem->len += realsize;
    mem->ptr[mem->len] = '\0';

    return realsize;
}

// 子函数,用于获取指定城市未来7天的天气预报
int get_weather_forecast(const char *city) {
    char url[256];
    sprintf(url, "https://api.map.baidu.com/weather/v1/?district_id=%s&ak=your_ak", city);

    CURL *curl = curl_easy_init();
    struct string response;
    response.ptr = malloc(1);
    response.len = 0;

    if (curl && response.ptr) {
        // 设置请求选项
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        // 执行请求
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK) {
            fprintf(stderr, "请求失败: %s\n", curl_easy_strerror(res));
            free(response.ptr);
            curl_easy_cleanup(curl);
            return -1;
        }

        // 解析JSON数据
        struct json_object *json = json_tokener_parse(response.ptr);
        if (json == NULL) {
            fprintf(stderr, "JSON解析失败\n");
            free(response.ptr);
            curl_easy_cleanup(curl);
            return -1;
        }

        // 解析天气预报
        struct json_object *result, *weather_data;
        json_object_object_get_ex(json, "result", &result);
        json_object_object_get_ex(result, "weather_data", &weather_data);

        int i;
        int num_days = json_object_array_length(weather_data);
        for (i = 0; i < num_days; i++) {
            struct json_object *day = json_object_array_get_idx(weather_data, i);
            const char *date, *weather, *temperature;
            date = json_object_get_string(json_object_object_get(day, "date"));
            weather = json_object_get_string(json_object_object_get(day, "weather"));
            temperature = json_object_get_string(json_object_object_get(day, "temperature"));

            printf("日期:%s\n天气:%s\n温度:%s\n\n", date, weather, temperature);
        }

        free(response.ptr);
        json_object_put(json);
    } else {
        fprintf(stderr, "初始化失败\n");
        if (response.ptr) {
            free(response.ptr);
        }
        if (curl) {
            curl_easy_cleanup(curl);
        }
        return -1;
    }

    curl_easy_cleanup(curl);
    return 0;
}

int main() {
    const char *city = "your_city_code";
    int ret = get_weather_forecast(city);
    if (ret == 0) {
        printf("天气预报获取成功!\n");
    } else {
        printf("天气预报获取失败!\n");
    }

    return 0;
}

在示例代码中,使用curl_easy_setopt函数设置HTTP GET请求的URL,并通过CURLOPT_WRITEFUNCTIONCURLOPT_WRITEDATA选项指定回调函数,将响应数据存储在内存中。

然后,使用json_tokener_parse函数解析返回的JSON数据,并提取其中的天气预报信息。通过json_object_object_getjson_object_array_get_idx等函数获取JSON对象和数组中的数据。

注意:代码中的URL中的YOUR_AKYOUR_CITY_CODE需要使用你自己的百度API密钥和城市代码替换。

通过调用get_weather_forecast函数,可以获取指定城市未来7天的天气预报并打印出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/864339.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

24届近5年南京大学自动化考研院校分析

今天给大家带来的是南京大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、南京大学 学校简介 南京大学是一所历史悠久、声誉卓著的高等学府。其前身是创建于1902年的三江师范学堂&#xff0c;此后历经两江师范学堂、南京高等师范学校、国立东南大学、国立第四中…

数字孪生和元宇宙之间的差别与联系是什么?

元宇宙和数字孪生是两个引人瞩目的概念&#xff0c;它们在虚拟与现实世界的交汇点上呈现出独特的视角和应用。虽然二者都涉及数字化和模拟技术&#xff0c;但在其差异与联系上&#xff0c;我们可以发现深刻的内涵和潜力。 首先&#xff0c;元宇宙是一个更为宽泛的概念&#xf…

嵌入式是大坑吗?

嵌入式不是坑&#xff0c;但里面遍地是坑。一不小心&#xff0c;你就会掉进去。 嵌入式覆盖的范围太广&#xff0c;低端的产品太多。 单片机叫嵌入式&#xff0c;开发板叫嵌入式&#xff0c;摄像头叫嵌入式&#xff0c;手机、平板电脑、通讯基站、无人机、机器人、自动驾驶汽…

C++之红黑树剖析

博主&#xff1a;拖拉机厂第一代码手 gitee:拖拉机厂第一代码手 已收录到专栏C&#xff0c;点击访问 目录 &#x1f4b4;红黑树简介&#x1f4b5;红黑树的插入操作&#x1f4b6;红黑树的删除操作&#x1f4b7;红黑树的实现&#x1f4b8;红黑树节点的定义&#x1f4b8;红黑树结构…

autoware 之 op_behavior_selector行为选择器状态机代码分析

autoware 1 op_behavior_selector行为选择器状态机代码分析 /这里是整个状态机运行时的结构&#xff1a;/ //停止状态:[#停止状态]//任务完成状态:[#任务完成状态]//转向状态:[*前进状态,#转向状态]//停止信号停止状态:[*停止信号等待状态,#停止信号停止状态]//前进状态 :[*目…

C语言学习系列-->看淡指针(1)

文章目录 一、概述二、指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符2.2.1 指针变量2.2.2 拆解指针类型2.2.4 解引用操作符 2.3 指针变量的大小 三、指针变量的意义3.1 指针的解引用指针-整数 四、 const修饰指针五、指针运算5.1 指针- 整数5.2 指针-指针5.3 指针…

OpenText 企业安全 调查 产品简介

关于OpenText OpenText是一家信息软件公司&#xff0c;使企业能够通过市场领先的信息管理解决方案&#xff08;内部或云中&#xff09;获得洞察力。 全球面临的数字风险 市场合力驱动的信息管理 处于风暴中心的信息 →安全漏洞和数据保护 • 防止威胁并将破坏影响降至最低 …

通过PostMan监视提交文件,验证web文件传输

切换文件流,传输文件 找到图片地址 发送请求然后接受 再来一张 哈&#xff0c;谢谢各位同志的阅读&#xff0c;然后呢如果觉得本文对您有所帮助的话&#xff0c;还给个免费的赞捏 Thanks♪(&#xff65;ω&#xff65;)&#xff89;

【二】数据库系统

数据库系统的分层抽象DBMS 数据的三个层次从 数据 到 数据的结构----模式数据库系统的三级模式&#xff08;三级视图&#xff09;数据库系统的两层映像数据库系统的两个独立性数据库系统的标准结构 数据模型从 模式 到 模式的结构----数据模型三大经典数据模型 数据库的演变与发…

给大家推荐9个Linux高效运维命令技巧!

文章目录 前言一、实用的 xargs 命令二、命令或脚本后台运行三、找出当前系统内存使用量较高的进程四、找出当前系统CPU使用量较高的进程五、同时查看多个日志或数据文件六、持续ping并将结果记录到日志七、查看tcp连接状态八、查找80端口请求数最高的前20个IP九、ssh实现端口转…

构建高性能的MongoDB数据迁移工具:Java的开发实践

随着大数据时代的到来&#xff0c;数据迁移成为许多企业和组织必须面对的挑战之一。作为一种非关系型数据库&#xff0c;MongoDB在应用开发中得到了广泛的应用。为了满足数据迁移的需求&#xff0c;我们需要一个高性能、稳定可靠的MongoDB数据迁移工具。下面将分享使用Java开发…

【华秋推荐】新能源汽车中的T-BOX系统,你了解多少?

近几年&#xff0c;新能源汽车产业进入了加速发展的阶段。我国的新能源汽车产业&#xff0c;经过多年的持续努力&#xff0c;技术水平显著提升、产业体系日趋完善、企业竞争力大幅增强&#xff0c;呈现市场规模、发展质量“双提升”的良好局面。同时&#xff0c;通过国家多年来…

【碎碎念】在CSDN 512天创作纪念日

‍‍&#x1f3e1;博客主页&#xff1a; virobotics的CSDN博客&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『碎碎念』 &#x1f37b;上篇纪念文&#xff1a; 我的创作纪念日 文章目录 &#x1f4e9;&#x1f4e9;&#x1f4e9;前言&#x1f…

thinkphp中分页paginate和group by一起使用时 代码异常的解决办法

1. paginate和group by报错&#xff0c;代码如下&#xff0c;月份分组 $page intval($where[page]);$limit intval($where[limit]);$start_time $where[start_time];$end_time $where[end_time];$query Db::table(eb_bonuslistlog)->field(DATE_FORMAT(create_time,&qu…

Cookie的详解

Cookie Cookie为什么要用Cookie&#xff1f;Cookie是什么&#xff1f;Cookie怎么用&#xff1f;Cookie常用属性修改与删除&#xff1a;在浏览器查看cookie前端页面读取CookieJava后端读写cookie最典型的cookie--JESSIONID是什么&#xff1f;什么时候种下JSESSIONID&#xff1f;…

2023年京东按摩仪行业数据分析(京东销售数据分析)

近年来&#xff0c;小家电行业凭借功能与颜值&#xff0c;取代黑电和白电&#xff0c;成为家电市场的主要增长点。在这一市场背景下&#xff0c;颜值更高、功能更丰富、品种更齐全的各类按摩仪&#xff0c;借助新消费和电子商务的风潮&#xff0c;陆续被推上市场。今年&#xf…

通达信波段选股公式,使用钱德动量摆动指标(CMO)

钱德动量摆动指标(CMO)是由图莎尔钱德发明的&#xff0c;取值范围在-100到100之间&#xff0c;是捕捉价格动量的技术指标。该指标计算近期涨幅之和与近期跌幅之和的差值&#xff0c;然后将计算结果除以同期所有价格波动的总和。本文的波段选股公式使用均线识别趋势&#xff0c;…

微信小程序上传图片和文件

1.从微信里选择图片或文件上传 使用的vant的上传组件 原生用 wx.chooseMessageFile() html <!-- 从微信上面选择文件 --><van-uploader file-list"{{ file }}" bind:after-read"afterRead" max-count"{{3}}" deletable"{{ true…

GrapeCity Documents for PDF (GcPdf) 6.2 Crack

GrapeCity PDF 文档 (GcPdf) 改进了对由 GcPdf 以外的软件生成的现有 PDF 文档的处理 在新的 v6.2 版本中&#xff0c;GcPdf 增强了 PDF 文档的加载和保存&#xff0c;并提供以下优势&#xff1a; GcPdf 现在可以加载和保存可能不严格符合 PDF 规范的 PDF 文档。GcPdf 现在将…

典籍研读+书法精进 暄桐「见道明心的笔墨」课程开课啦

8月12日&#xff0c;《林曦老师的线上直播书法课》之「见道明心的笔墨」就要开课啦。林曦老师将带我们去往中国文人精神世界的后花园&#xff0c;一起阅读《金刚经》《老子》等典籍。是不是很期待&#xff1f; 在2011年&#xff0c;暄桐成立的最初&#xff0c;课程便是面向零基…