[大师C语言(第二十三篇)]C语言常用第三方库总结

C语言因其高效、灵活和可移植的特性,在系统编程、嵌入式开发、操作系统、网络编程等领域被广泛使用。C语言的标准库提供了一些基础功能,但在实际开发中,开发者通常需要借助第三方库来完成更加复杂的任务。本文将总结一些常用的C语言第三方库,并展示如何在C程序中使用这些库。

1. 数据库访问

SQLite

  • 简介:一个轻量级的嵌入式数据库,常用于移动应用和桌面应用中。
  • 使用:通过SQLite提供的API进行数据库操作。
#include <sqlite3.h>int main() {sqlite3 *db;char *err_msg = 0;int rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}sqlite3_close(db);return 0;
}

2. 网络编程

libcurl

  • 简介:一个用于传输文件的客户端库,支持HTTP、HTTPS、FTP等多种协议。
  • 使用:使用libcurl提供的函数进行网络请求。
#include <curl/curl.h>int main(void) {CURL *curl;CURLcode res;curl = curl_easy_init();if(curl) {curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");res = curl_easy_perform(curl);if(res != CURLE_OK)fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(res));curl_easy_cleanup(curl);}return 0;
}

3. 图形界面

GTK

  • 简介:一个跨平台的图形界面库,用于创建具有原生感的GUI应用程序。
  • 使用:使用GTK提供的函数和宏创建和管理GUI元素。
#include <gtk/gtk.h>static void print_hello(GtkWidget *widget, gpointer data) {g_print("Hello World\n");
}static void activate(GtkApplication *app, gpointer user_data) {GtkWidget *window;GtkWidget *button;GtkWidget *button_box;window = gtk_application_window_new(app);gtk_window_set_title(GTK_WINDOW(window), "Window");gtk_window_set_default_size(GTK_WINDOW(window), 200, 200);button_box = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);gtk_container_add(GTK_CONTAINER(window), button_box);button = gtk_button_new_with_label("Hello World");g_signal_connect(button, "clicked", G_CALLBACK(print_hello), NULL);g_signal_connect_swapped(button, "clicked", G_CALLBACK(gtk_widget_destroy), window);gtk_container_add(GTK_CONTAINER(button_box), button);gtk_widget_show_all(window);
}int main(int argc, char *argv[]) {GtkApplication *app;int status;app = gtk_application_new("org.gtk.example", G_APPLICATION_FLAGS_NONE);g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);status = g_application_run(G_APPLICATION(app), argc, argv);g_object_unref(app);return status;
}

4. XML解析

libxml2

  • 简介:一个用于解析和构建XML文档的库。
  • 使用:使用libxml2提供的API进行XML解析。
#include <libxml/parser.h>static void parseDoc(char *docname) {xmlDocPtr doc;xmlNodePtr cur;doc = xmlReadFile(docname, NULL, XML_PARSE_NOBLANKS);if (doc == NULL) {fprintf(stderr, "Document not parsed successfully.\n");return;}cur = xmlDocGetRootElement(doc);if (cur == NULL) {fprintf(stderr, "empty document\n");xmlFreeDoc(doc);return;}cur = cur->xmlChildrenNode;while (cur != NULL) {if ((!xmlStrcmp(cur->name, (const xmlChar *)"book"))) {xmlNodePtr child = cur->xmlChildrenNode;while (child != NULL) {if ((!xmlStrcmp(child->name, (const xmlChar *)"title"))) {xmlChar *value = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);printf("title: %s\n", value);xmlFree(value);}child = child->next;}}cur = cur->next;}xmlFreeDoc(doc);
}int main(int argc, char **argv) {if (argc <= 1) {printf("Usage: %s docname\n", argv[0]);return(1);}parseDoc(argv[1]);return(0);
}

5. JSON处理

cJSON

  • 简介:一个轻量级的JSON解析库。
  • 使用:使用cJSON提供的API解析和生成JSON数据。
#include <cjson/cJSON.h>int main() {char *json_string = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}";cJSON *json = cJSON_Parse(json_string);cJSON *name = cJSON_GetObjectItemCaseSensitive(json, "name");cJSON *age = cJSON_GetObjectItemCaseSensitive(json, "age");cJSON *city = cJSON_GetObjectItemCaseSensitive(json, "city");printf("Name: %s\n", name->valuestring);printf("Age: %d\n", age->valueint);printf("City: %s\n", city->valuestring);cJSON_Delete(json);return 0;
}

6. 多媒体处理

FFmpeg

  • 简介:一个用于处理音频和视频的库,包括编解码、转换、流处理等功能。
  • 使用:使用FFmpeg提供的API进行多媒体处理。
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libavutil/imgutils.h>int main() {const char *input_file = "input.mp4";const char *output_file = "output.yuv";AVFormatContext *input_ctx = NULL;AVCodecContext *codec_ctx = NULL;AVPacket packet;AVFrame *frame = NULL;int video_stream_index = -1;int ret;// 注册所有解码器avcodec_register_all();// 打开输入文件if (avformat_open_input(&input_ctx, input_file, NULL, NULL) < 0) {fprintf(stderr, "Could not open input file '%s'\n", input_file);return -1;}// 查找视频流for (int i = 0; i < input_ctx->nb_streams; i++) {if (input_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {video_stream_index = i;break;}}if (video_stream_index == -1) {fprintf(stderr, "Could not find a video stream in the input file\n");return -1;}// 打开解码器AVCodec *codec = avcodec_find_decoder(input_ctx->streams[video_stream_index]->codecpar->codec_id);codec_ctx = avcodec_alloc_context3(codec);avcodec_parameters_to_context(codec_ctx, input_ctx->streams[video_stream_index]->codecpar);if (avcodec_open2(codec_ctx, codec, NULL) < 0) {fprintf(stderr, "Could not open codec\n");return -1;}// 读取和解码视频帧frame = av_frame_alloc();FILE *output_file_fd = fopen(output_file, "wb");while (av_read_frame(input_ctx, &packet) >= 0) {if (packet.stream_index == video_stream_index) {ret = avcodec_send_packet(codec_ctx, &packet);if (ret < 0) {fprintf(stderr, "Error sending a packet for decoding\n");break;}while (ret >= 0) {ret = avcodec_receive_frame(codec_ctx, frame);if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {break;} else if (ret < 0) {fprintf(stderr, "Error during decoding\n");break;}// 将解码后的帧写入输出文件for (int i = 0; i < 3; i++) {fwrite(frame->data[i], 1, frame->linesize[i] * frame->height / (i == 0 ? 1 : 2), output_file_fd);}}}av_packet_unref(&packet);}// 清理资源fclose(output_file_fd);av_frame_free(&frame);avcodec_free_context(&codec_ctx);avformat_close_input(&input_ctx);return 0;
}

7. 科学计算

GSL

  • 简介:GNU科学库(GSL)提供了一系列用于数学、物理和工程问题的函数和数据结构。
  • 使用:使用GSL提供的函数进行科学计算。
#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>int main() {double x = 5.0;double y = gsl_sf_bessel_J0(x);printf("J0(%g) = %g\n", x, y);return 0;
}

8. 加密和安全

OpenSSL

  • 简介:一个开源的加密库,提供了一系列加密和SSL/TLS功能。
  • 使用:使用OpenSSL提供的API进行加密和安全通信。
#include <openssl/evp.h>int main() {EVP_CIPHER_CTX *ctx;unsigned char key[32], iv[16], in[1024], out[1024 + EVP_MAX_BLOCK_LENGTH];int len, ciphertext_len;/* 初始化密钥和IV */memset(key, 0x00, sizeof(key));memset(iv, 0x00, sizeof(iv));/* 创建并初始化加密上下文 */ctx = EVP_CIPHER_CTX_new();/* 初始化加密操作 */EVP_EncryptInit_ex(ctx, EVP_aes_256_cbc(), NULL, key, iv);/* 提供要加密的数据 */len = strlen((char *)in);EVP_EncryptUpdate(ctx, out, &len, in, len);/* 最终化加密操作 */ciphertext_len = len;EVP_EncryptFinal_ex(ctx, out + len, &len);ciphertext_len += len;/* 清理资源 */EVP_CIPHER_CTX_free(ctx);printf("Ciphertext is %d bytes long\n", ciphertext_len);return 0;
}

9. 国际化

gettext

  • 简介:一个用于国际化(i18n)和本地化(l10n)的库,用于处理不同语言的文本。
  • 使用:使用gettext提供的函数实现程序的国际化。
#include <libintl.h>
#include <locale.h>#define _(String) gettext (String)int main() {setlocale(LC_ALL, "");bindtextdomain("myapp", "/path/to/my/locale");textdomain("myapp");printf(_("Hello, World!\n"));return 0;
}

10. 其他

Lua

  • 简介:一个轻量级的嵌入式脚本语言,可以与C语言进行交互。
  • 使用:使用Lua提供的C API嵌入Lua脚本到C程序中。
#include <stdio.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>int main() {lua_State *L = luaL_newstate();luaL_openlibs(L);luaL_loadfile(L, "script.lua");lua_pcall(L, 0, 0, 0);lua_getglobal(L, "greeting");const char *greeting = lua_tostring(L, -1);printf("%s\n", greeting);lua_close(L);return 0;
}

如何在自己的程序中使用第三方库

在使用第三方库时,通常需要以下几个步骤:

  1. 下载和安装库:从官方网站或代码仓库下载库的源代码,并按照提供的指南进行编译和安装。

  2. 包含头文件:在C程序中使用#include指令包含库的头文件。

  3. 链接库:在编译时,需要指定链接所需的库文件。这通常通过编译器选项(如-llibrary)来完成。

  4. 调用库函数:在程序中直接调用库提供的函数来实现所需的功能。

  5. 处理错误和异常:正确处理库函数可能返回的错误和异常情况。

  6. 资源管理:在使用库提供的资源(如内存、文件句柄等)后,确保释放这些资源以避免内存泄漏等问题。

每个库的具体使用方法可能会有所不同,因此需要参考库的官方文档来获取详细的信息和示例。

代码举例

以下是一个使用SQLite库的简单例子,展示了如何在自己的程序中使用第三方库:

#include <stdio.h>
#include <sqlite3.h>static int callback(void *NotUsed, int argc, char **argv, char **azColName) {NotUsed = 0;for (int i = 0; i < argc; i++) {printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");}printf("\n");return 0;
}int main() {sqlite3 *db;char *zErrMsg = 0;int rc;/* 打开数据库 */rc = sqlite3_open("example.db", &db);if (rc) {fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}/* 执行SQL语句 */const char *sql = "CREATE TABLE IF NOT EXISTS COMPANY(" \"ID INT PRIMARY KEY     NOT NULL," \"NAME           TEXT    NOT NULL," \"AGE            INT     NOT NULL," \"ADDRESS        CHAR(50)," \"SALARY         REAL);";rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);sqlite3_close(db);return 1;}/* 插入数据 */sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \"VALUES (1, 'Paul', 32, 'California', 20000.00); " \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \"VALUES (2, 'Allen', 25, 'Texas', 15000.00); " \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \"VALUES (3, 'Teddy', 23, 'Norway', 20000.00); " \"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \"VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00);";rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);sqlite3_close(db);return 1;}/* 查询数据 */sql = "SELECT * from COMPANY";rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", zErrMsg);sqlite3_free(zErrMsg);sqlite3_close(db);return 1;}/* 关闭数据库 */sqlite3_close(db);return 0;
}

在这个例子中,我们首先包含了SQLite的头文件,然后定义了一个回调函数用于处理查询结果。在main函数中,我们打开了一个数据库连接,创建了一个表,插入了一些数据,并查询了这些数据。最后,我们关闭了数据库连接。

编译和运行程序

要编译和运行使用SQLite的程序,你需要确保已经安装了SQLite库,并且在编译时链接到SQLite库。以下是一个典型的编译命令:

gcc -o example example.c -lsqlite3

这将编译example.c文件并生成名为example的可执行文件。在运行程序之前,确保你的SQLite库是正确安装的,并且可执行文件有权限访问数据库文件。

总结

C语言的第三方库极大地扩展了语言的能力,允许开发者轻松地处理复杂的任务,如数据库操作、网络通信、图形界面、加密等。使用这些库可以显著提高开发效率,减少重复劳动,并促进代码的重用。在选择和使用第三方库时,应该考虑库的成熟度、社区支持、文档齐全性和兼容性。正确地使用第三方库可以极大地提升项目的质量和可靠性。

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

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

相关文章

MbedTLS源码跨平台编译(window/macos/linux)

1.window平台编译: 克隆: git clone --recursive https://github.com/Mbed-TLS/mbedtls.git 克隆成功 添加OpenSSL环境变量 验证环境 使用cmake编译 cmake ../生成配置时出错 出现上面原因是克隆下来的library与programs及tests目录少文件了,直接下载zip包替换library目录

docker pull image 报错 dial tcp 31.13.88.169:443: i/o timeout

一、错误重现 error pulling image configuration: download failed after attempts6: dial tcp 31.13.88.169:443: i/o timeout 在执行docker build构建镜像&#xff0c;拉取镜像时报错 或者直接docker pull镜像时报错 实质都是拉取镜像源超时报错&#xff0c;那么就是镜像源…

记录移动端项目iOS端相对于安卓的各种兼容性问题

目录 1、iOS端列表页面屏幕滑动滞涩感强烈 2、iOS端的按钮以及添加的边框和倒角属性失效问题 3、iOS错误识别页面时间为 a 标签 4、iOS端调起软键盘界面布局走位问题 5、iOS端滚动条部分滚动样式不生效问题 背景 &#xff1a; 在开发移动端H5项目的过程中&#xff0c;遇到…

let const var的区别

在JavaScript中&#xff0c;let、const和var都用于声明变量&#xff0c;但是它们有几个关键的差异&#xff1a; 作用域 (Scope): var 声明的变量拥有函数作用域或全局作用域。在函数外部声明的var变量是全局的&#xff0c;在函数内部声明的var变量是局部的。let 和 const 声明的…

Java sql中 >、<、≥、≤ 等的转义字符 代替符号

Java中写sql会遇到一些 >、<、≥、≤ 符号转化问题&#xff0c;导致sql语句无法运行。 替代方法如下&#xff1a; 第一种方法&#xff1a; < &#xff1a; < < &#xff1a; < > &#xff1a; > > &#xff1a; > sql示例如下&#x…

IEDA 默认集成依赖概述

IEDA 默认集成依赖概述 目录概述需求&#xff1a; 设计思路实现思路分析 1.Developer Tools:GraalVM Native supportGraphQL DGs Code GenerationSpring Boot DevToolsLombokSpring Configuration ProcessorDocker Compose supportSpring Modulith 2.WebWebSpring WebSpring Re…

详解 Flink 的 window API

一、window 概述 ​ Streaming 流式计算是一种被设计用于处理无限数据集的数据处理引擎&#xff0c;而无限数据集是指一种不断增长的本质上无限的数据集&#xff0c;而 Flink window 是一种将无限数据切割为有限块进行处理的手段。window 是无限数据流处理的核心&#xff0c; …

【Java 新特性系列】Java 8 Optional 类完全指南

Optional 是 Java8 提供的为了解决 null 安全问题的一个 API。善用 Optional 可以使我们代码中很多繁琐、丑陋的设计变得十分优雅。 文章目录 1、Optional 类概述1.1、Optional 类介绍1.2、使用 Optional 的前后对比1.2.1、不使用 Optional1.2.2、使用 Optional 2、Java 8 中 O…

信奥之路(五)——顺序结构

** 以顺序、选择和循环三种基本结构的组合来描述程序&#xff0c;是结构化程序设计方法的主要特征之一。每条语句按照自上而下的顺序依次运行一次&#xff0c;这种自上而下依次执行的程序称为顺序结构程序。 ** 1.题目描述 爸爸妈妈让小明去附近的超市买一些玉米回来。爸爸…

单片机原理及技术(三)—— AT89S51单片机(二)(C51编程)

一、AT89S51单片机的并行I/O端口 1.1 P0口 AT89S51的P0口是一个通用的I/O口&#xff0c;可以用于输入和输出。每个引脚都可以通过软件控制为输入或输出模式。 1.1.1 P0口的工作原理 P0口的工作原理是通过对P0寄存器的读写操作来控制P0口的引脚。 输出模式&#xff1a;当P0口…

python --监听鼠标事件

import pyautogui from pynput import mouse, keyboardpyautogui.FAILSAFE Falseclass MouseMonitor:def __init__(self):self.mouse mouse.Controller()self.lock Truedef on_move(self, x, y):鼠标位移时回调函数if self.lock:print(11)pyautogui.moveTo(500, 500)self.loc…

C++ 纯虚函数 virtual = 0

上代码&#xff0c;看一下下面类的封装&#xff1a; class BlockerBase {public:virtual ~BlockerBase() default;virtual void Reset() 0;virtual void ClearObserved() 0;virtual void ClearPublished() 0;virtual void Observe() 0;virtual bool IsObservedEmpty() co…

UI学习笔记(一)

UI学习 一&#xff1a;UIView基础frame属性隐藏视图对象&#xff1a;UIView的层级关系 二&#xff1a;UIWindow对象三&#xff1a;UIViewController基础UIViewController使用 四&#xff1a;定时器与视图移动五&#xff1a;UISwitch控件六&#xff1a;滑动条和进度条七&#xf…

VMware给没安装VMTools的系统封装ISO以送入文件

VMware给没安装VMTools的系统封装ISO以送入文件&#xff0c;其实不需要其它工具 VMware自带mkisofs 2.01&#xff0c;不过mkisofs 2.01已经停止更新&#xff0c;最大的问题是不支持中文&#xff0c;也不支持UEFI引导记录&#xff0c;但一般已经够用了&#xff0c;除此之外还可…

跨库数据同步 SYNC data

1.exp imp 由于DBV行不通 2. 直接使用pl/sql 的导入导出&#xff0c;导出insert脚本肯定不现实&#xff0c;导成专用pde文件&#xff0c;发现24小时只能导入1000多万表&#xff08;基本每两三分钟10000&#xff09;。 3.使用expdp impdp, 遇到的问题&#xff08;imperva会拦截…

2021年vue面试题整理(万字解析)

一、对MVVM的理解 MVVM分为Model、View、ViewModel。 Model 代表数据模型&#xff0c;数据和业务逻辑都在Model层中定义&#xff1b;泛指后端进行的各种业务逻辑处理和数据操控&#xff0c;对于前端来说就是后端提供的 api 接口。 View 代表UI视图&#xff0c;负责数据的展示…

默认launcher

目录 前提代码 前提 刷机后开机提示选择launcher应用&#xff0c;此时设备中有至少两个apk配置有属性&#xff0c;想要开机自动进入launcher,可以通过修改ResolverActivity,在开机时默认选择指定的launcher程序 代码 //frameworks/base/core/java/com/android/internal/app/…

【Python数据分析--Numpy库】Python数据分析Numpy库学习笔记,Python数据分析教程,Python数据分析学习笔记(小白入门)

一&#xff0c;Numpy教程 给大家推荐一个很不错的笔记&#xff0c;个人长期学习过程中整理的 Python超详细的学习笔记共21W字点我获取 1-1 安装 1-1-1 使用已有的发行版本 对于许多用户&#xff0c;尤其是在 Windows 上&#xff0c;最简单的方法是下载以下的 Python 发行版…

java 8 新特性CompletableFuture使用

准备工作&#xff1a;定义一个线程池 ExecutorService pool Executors.newFixedThreadPool(3,(Runnable r)->{Thread tnew Thread(r);t.setDaemon(true);return t;});一、执行方式 1、对于有返回值的 CompletableFuture<String> futureCompletableFuture.supplyAsync…

Swift 序列(Sequence)排序面面俱到 - 从过去到现在(一)

概览 在任何语言中对序列(或集合)元素的排序无疑是一种司空见惯的常规操作,在 Swift 语言里自然也不例外。序列排序看似简单,实则“暗藏玄机”。 要想真正掌握 Swift 语言中对排序的“各种姿势”,我们还得从长计议。不如就先从最简单的排序基本功开始聊起吧。 在本篇博…