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

一、概述

当前文章介绍如何在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.mzph.cn/news/32809.shtml

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

相关文章

【算法题】2561. 重排水果

题目&#xff1a; 你有两个果篮&#xff0c;每个果篮中有 n 个水果。给你两个下标从 0 开始的整数数组 basket1 和 basket2 &#xff0c;用以表示两个果篮中每个水果的成本。 你希望两个果篮相等。为此&#xff0c;可以根据需要多次执行下述操作&#xff1a; 选中两个下标 i…

用MariaDB创建数据库,SQL练习,MarialDB安装和使用

前言&#xff1a;MariaDB数据库管理系统是MySQL的一个分支&#xff0c;主要由开源社区在维护&#xff0c;采用GPL授权许可 MariaDB的目的是完全兼容MySQL&#xff0c;包括API和命令行&#xff0c;使之能轻松成为MySQL的代替品。在存储引擎方面&#xff0c;使用XtraDB来代替MySQ…

Electron+vue3项目使用SQLite3数据库

SQLite 是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;我们不需要在系统中配置。 就像其他数据库&#xff0c;SQLite 引擎不是一个独立的进程&am…

Scratch 之 如何矢量图中去除矢量刺

如果您曾经在“矢量编辑器”中使用过轮廓&#xff0c;那么您一定已经看到了这一点... 这被称为矢量刺&#xff0c;只有当你正在绘制的形状中有尖锐的点或角时才会发生这种情况&#xff0c;这真的很烦人&#x1f621; 所以在这个视频中&#xff0c;我将向你展示如何摆脱这些令人…

Springboot后端通过路径映射获取本机图片资源

项目场景&#xff1a; 项目中对图片的处理与查看是必不可少的&#xff0c;本文将讲解如何通过项目路径来获取到本机电脑的图片资源 如图所示&#xff0c;在我的本机D盘的图片测试文件夹(文件夹名字不要有中文)下有一些图片&#xff0c; 我们要在浏览器上访问到这些图片&#…

Matlab实现神经网络SOM算法(附上完整仿真源码)

神经网络SOM算法是一种基于自组织的无监督学习算法&#xff0c;其全称为Self-Organizing Map&#xff0c;可以用来对数据进行聚类和可视化。本文将介绍如何使用Matlab实现神经网络SOM算法。 文章目录 一、准备工作二、数据准备三、SOM算法实现四、聚类结果分析五、总结六、完整…

在时间和频率域中准确地测量太阳黑子活动及使用信号处理工具箱(TM)生成广泛的波形,如正弦波、方波等研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

python压缩pdf文件大小

pdf文件过大&#xff0c;经常会是一个问题&#xff0c;但是市面上基本上都是收费的工具&#xff0c;wps需要开会员才能使用。因此找了一个python库进行试验&#xff1a; 首先需要安装 pip install aspose-pdf 运行的代码&#xff1a; import aspose.pdf as apcompressPdfDo…

你的服务器安全吗?--服务器防渗透

1、概述 在本人所处的公司的服务器正式遭到黑客攻击之前&#xff0c;一直都以为 黑客 是个遥不可及的词&#xff0c;直到真正成为了受害者时&#xff0c;才猛然意识到安全的重要性。有一些基本经验和心得总结出来&#xff0c;和同行分享一下吧。 2、暴破手段 最粗暴的黑客行为…

篇十八:状态模式:状态驱动的行为

篇十八&#xff1a;"状态模式&#xff1a;状态驱动的行为" 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&…

什么是敏捷开发?

敏捷开发流程&#xff1a;制度化、规范化地PUA程序员的顶级神器&#xff01;&#xff01;&#xff01;

SQL | 使用函数处理数据

8-使用函数处理数据 8.1-函数 SQL可以用函数来处理数据。函数一般是在数据上执行的&#xff0c;为数据的转换和处理提供了方便。 8.1.1 函数带来的问题 每种DBMS都有特定的函数&#xff0c;只有很少一部分函数&#xff0c;是被所有主要的DBMS等同的支持。 虽然所有的类型的…

设计模式十四:责任链模式(Chain of Responsibility Pattern)

责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你将请求沿着处理者链进行传递&#xff0c;直到有一个处理者能够处理该请求。 在责任链模式中&#xff0c;多个处理者对象被连接成一个链。当接收到一个请求时&#xf…

【C++】C++异常

文章目录 1. C语言传统处理错误的方式2. C异常的概念3. 异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 4. C标准库的异常体系5. 自定义的异常体系6. 异常的优缺点 1. C语言传统处理错误的方式 C语言传统的错误处理机制有两个&#xff1a; 终止程…

SQL注入漏洞

SQL注入漏洞是一种常见的网络安全漏洞&#xff0c;它允许攻击者通过在应用程序中插入恶意的SQL代码来执行未经授权的数据库操作。这可能导致敏感数据泄露、数据损坏或完全接管系统的风险。 SQL注入漏洞的原理是应用程序未能正确验证和过滤用户输入的数据&#xff0c;而直接将用…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(七)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

v-md-editor自定义锚点(生成目录)数组转树结构

接前两篇博文&#xff0c;最终方案终于定了&#xff0c;也把之前做的编辑器模式给否决了&#xff0c;原因是系统中有老的文档需要平替&#xff0c;因此就不能通过编辑器这种模式了&#xff0c;太麻烦了。 最终方案&#xff1a;线下手动pandoc word转markdown&#xff0c;然后将…

在langchain中使用自定义example selector

在langchain中使用自定义example selector 简介 在之前的文章中&#xff0c;我们提到了可以在跟大模型交互的时候&#xff0c;给大模型提供一些具体的例子内容&#xff0c;方便大模型从这些内容中获取想要的答案。这种方便的机制在langchain中叫做FewShotPromptTemplate。 如…

使用Java根据表名导出与导入Sql

前言 很粗糙啊&#xff0c;有很多可以优化的地方&#xff0c;而且也不安全&#xff0c;但是临时用还是OK的&#xff0c;我这个是公司里面的单机软件&#xff0c;不联网。 嗨&#xff01;我是一名社交媒体增长黑客&#xff0c;很高兴能帮助您优化和丰富关于批量作业导出和导入…

pycharm离线安装依赖包

一、对于单个下载离线包&#xff0c;然后安装 1、先去https://pypi.org/网站下载离线包&#xff0c;下载到本地&#xff1b; 2、从磁盘中找到刚刚下载包&#xff0c;点击确定就可以安装了 二、将本地项目所有依赖包全部下载下来&#xff0c;然后批量在另一个项目&#xff…