Linux下C语言调用libcurl库获取天气预报信息
一、概述
当前文章介绍如何在Linux(Ubuntu)下使用C语言调用libcurl库获取天气预报的方法。通过HTTP GET请求访问百度天气API,并解析返回的JSON数据,可以获取指定城市未来7天的天气预报信息。
二、设计思路
【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_ak
和your_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_WRITEFUNCTION
和CURLOPT_WRITEDATA
选项指定回调函数,将响应数据存储在内存中。
然后,使用json_tokener_parse
函数解析返回的JSON数据,并提取其中的天气预报信息。通过json_object_object_get
和json_object_array_get_idx
等函数获取JSON对象和数组中的数据。
注意:代码中的URL中的YOUR_AK
和YOUR_CITY_CODE
需要使用你自己的百度API密钥和城市代码替换。
通过调用get_weather_forecast
函数,可以获取指定城市未来7天的天气预报并打印出来。
相关文章:

Linux下C语言调用libcurl库获取天气预报信息
一、概述 当前文章介绍如何在Linux(Ubuntu)下使用C语言调用libcurl库获取天气预报的方法。通过HTTP GET请求访问百度天气API,并解析返回的JSON数据,可以获取指定城市未来7天的天气预报信息。 二、设计思路 【1】使用libcurl库进…...
“深入解析JVM:Java虚拟机原理和内部结构“
标题:深入解析JVM:Java虚拟机原理和内部结构 摘要:本文将深入解析JVM(Java虚拟机)的原理和内部结构。我们将从JVM的基础概念开始,逐步介绍其组成部分,包括类加载器、运行时数据区、字节码解释器…...
Arrays.asList() 返回的list不能add,remove
一.Arrays.asList() 返回的list不能add,remove Arrays.asList()返回的是List,而且是一个定长的List,所以不能转换为ArrayList,只能转换为AbstractList 原因在于asList()方法返回的是某个数组的列表形式,返回的列表只是数组的另一个视图,而数组本身并没…...

命令执行漏洞
1、命令执行漏洞 1.1、简介 Django是用Python开发的一个免费开源的Web结构,几乎包括了Web使用方方面面,能够用于快速建立高性能、文雅的网站,Diango提供了许多网站后台开发常常用到的模块,使开发者可以专注于业务部分。 1.2、漏…...
Hive 中 sort by 和 order by 的区别
文章目录 数据量大小区别作用范围 在 Hive 中, SORT BY 和 ORDER BY 都用于对查询结果进行排序,但它们在实现方式和适用场景上有一些区别。 数据量大小区别 SORT BY: SORT BY 用于在 Hive 中对查询结果进行排序,它的主要特点是在…...
网络资源利用最大化:爬虫带宽优化解决方案
大家好,作为一名专业的爬虫程序员,我们都知道在爬取大量数据的过程中,网络带宽是一个十分宝贵的资源。如果我们不合理地利用网络带宽,可能会导致爬虫任务的效率低下或者不稳定。今天,我将和大家分享一些优化爬虫带宽利…...

STDF - 基于 Svelte 和 Tailwind CSS 打造的移动 web UI 组件库,Svelte 生态里不可多得的优秀项目
Svelte 是一个新兴的前端框架,组件库不多,今天介绍一款 Svelte 移动端的组件库。 关于 STDF STDF 是一个移动端的 UI 组件库,主要用来开发移动端 web 应用。和我之前介绍的很多 Vue 组件库不一样,STDF 是基于近来新晋 js 框架 S…...

C语言一些有趣的冷门知识
文章目录 概要1.访问数组元素的方法运行结果 2.中括号的特殊用法运行结果 3.大括号的特殊用法运行结果 4.sizeof的用法运行结果 5.渐进运算符运行结果 小结 概要 本文章只是介绍一些有趣的C语言知识,纯属娱乐。这里所有的演示代码我是使用的编译器是Visual Studio …...
Oracle数据库审计
1.什么是审计 审计是用来监控和记录用户的数据库操作的 2.审计级别 语句审计权限审计对象审计 3.查看审计功能是否开启: show parameter audit;相关参数: audit_file_destOS中审计信息存放位置audit_sys_operations默认值为FALSE,即不审…...

Node.js新手在哪儿找小项目练手?
前言 可以参考一下下面的nodejs相关的项目,希望对你的学习有所帮助,废话少说,让我们直接进入正题>> 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件,具有快速、可扩展、易于使用和灵活的特点。它支持多种数…...

全国各城市-货物进出口总额和利用外资-外商直接投资额实际使用额(1999-2020年)
最新数据显示,全国各城市外商直接投资额实际使用额在过去一年中呈现了稳步增长的趋势。这一数据为研究者提供了对中国外商投资活动的全面了解,并对未来投资趋势和政策制定提供了重要参考。 首先,这一数据反映了中国各城市作为外商投资的热门目…...
CentOS 7查看磁盘空间
CentOS如何查看硬盘大小 CentOS是一种基于Linux的操作系统,主要用于服务器端应用。在服务器管理中,硬盘大小是一个非常重要的指标,查看硬盘大小可以帮助系统管理员有效地管理硬盘空间和避免硬盘满了的情况。 方法一:使用df命令 …...

基于PHP的轻量级博客typecho
本文完成于 5 月中旬,发布时未在最新版本上验证; 什么是 typecho ? Typecho 是一款基于 PHP 的博客软件,旨在成为世界上最强大的博客引擎。Typecho 在 GNU 通用公共许可证 2.0 下发布。支持多种数据库,原生支持 Markdo…...

MySQL多表查询
1.创建student和score表 创建score表 2.为student表和score表增加记录 向student表插入记录的INSERT语句如下: 向score表插入记录的INSERT语句如下: 1.查询student表的所有记录 2.查询student表的第2条到4条记录 3.从student表查询所有学生的学号&#…...
消息队列(12) - 定义服务器类
目录 前言设计思想 前言 之前,我们写了通信协议的具体设计,接下来我们设计服务器类 设计思想 我们先只考虑一个虚拟主机的情况下, 在一个虚拟主机的情况下,我们需要有一个session会话来帮助我们存储信息,并且既然是网络通信,那么socket关键字肯定也必不可少,我们在引入一个线…...
做正确的事 VS 正确的做事,哪个更重要?
管理大师彼得德鲁克曾在《有效的主管》一书中简明扼要地指出:“效率是以正确的方式做事,而效能则是做正确的事。效率和效能不应偏废,但这并不意味着效率和效能具有同样的重要性。我们当然希望同时提高效率和效能,但在效率与效能无…...

每日一题——寻找旋转排序数组中的最小值(I)
寻找旋转排序数组中的最小值——I 题目链接 思路 首先我们以数组[1,2,3,4,5,6,7]举个例子,经过旋转后它无非就这两种情况: 情况一:旋转过后数组变成两段有序数列: 情况二:旋转过后数组不变,仍然有序&…...

C语言每日一题:16:数对。
思路一:基本思路 1.x,y均不大于n,就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现: #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…...

中科亿海微浮点数转换定点数
引言 浮点数转换定点数是一种常见的数值转换技术,用于将浮点数表示转换为定点数表示。浮点数表示采用指数和尾数的形式,可以表示较大范围的数值,但存在精度有限的问题。而定点数表示则采用固定小数点位置的形式,具有固定的精度和范…...

JavaScript激活严格模式
在JavaScript中,严格模式是一种特殊的模式,通过’use strict’;去激活严格模式!在 JavaScript 中,“use strict” 是一种指令,表示在代码运行时启用严格模式,从而禁止使用一些不安全或者不规范的语法&#…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...