可变参数与 stdarg.h 库

news/2024/6/3 4:26:23 标签: C

可变参数与 stdarg.h 库

C 语言中,有时候需要编写具有可变数量参数的函数,例如 printf 函数就接受可变数量的参数。为了处理这种情况,C 标准库提供了 <stdarg.h> 头文件,其中定义了一些宏和变量类型,以便在参数个数未知时获取函数中的参数。

va_list 变量类型

va_list 是一个类型,用于存储由 va_start()va_arg()va_end() 这三个宏处理的信息。

库宏

va_start()

#include <stdio.h>
#include <stdarg.h>

void print_ints(int num, ...) {
    va_list args;
    va_start(args, num);

    for (int i = 0; i < num; ++i) {
        int value = va_arg(args, int);
        printf("%d: %d\n", i, value);
    }

    va_end(args);
}

int main() {
    print_ints(3, 10, 20, 30);
    return 0;
}

在这里插入图片描述

va_arg()

#include <stdio.h>
#include <stdarg.h>

void print_strings(int num, ...) {
    va_list args;
    va_start(args, num);

    for (int i = 0; i < num; ++i) {
        char *value = va_arg(args, char*);
        printf("%d: %s\n", i, value);
    }

    va_end(args);
}

int main() {
    print_strings(3, "Hello", "World", "!");
    return 0;
}

在这里插入图片描述

va_end()

#include <stdio.h>
#include <stdarg.h>

void print_doubles(int num, ...) {
    va_list args;
    va_start(args, num);

    for (int i = 0; i < num; ++i) {
        double value = va_arg(args, double);
        printf("%d: %.2f\n", i, value);
    }

    va_end(args);
}

int main() {
    print_doubles(3, 3.14, 2.718, 1.618);
    return 0;
}

在这里插入图片描述

这些例子展示了如何使用 <stdarg.h> 中的宏来处理可变数量的参数。va_start() 宏用于初始化参数列表,va_arg() 宏用于检索参数列表中的下一个参数,而 va_end() 宏用于结束对参数的处理。通过这些功能,我们可以在不知道参数个数的情况下编写更加灵活的函数。


http://www.niftyadmin.cn/n/5388296.html

相关文章

LangChain支持哔哩哔哩视频总结

是基于LangChain框架下的开发&#xff0c;所以最开始请先 pip install Langchain pip install bilibili-api-python 技术要点&#xff1a; 使用Langchain框架自带的Document loaders 修改BiliBiliLoader的源码&#xff0c;自带的并不支持当前b站的视频加载 源码文件修改&a…

AIoT网关 人工智能物联网网关

AIoT(人工智能物联网)作为新一代技术的代表&#xff0c;正以前所未有的速度改变着我们的生活方式。在这个智能时代&#xff0c;AIoT网关的重要性日益凸显。它不仅是连接智能设备和应用的关键&#xff0c;同时也是实现智能化家居、智慧城市和工业自动化的必备技术。      一…

JWT(JSON Web Token)原理、应用与安全性分析

随着互联网的快速发展&#xff0c;Web应用的安全性越来越受到重视。在众多的安全认证技术中&#xff0c;JSON Web Token&#xff08;JWT&#xff09;凭借其简洁、自包含和传输安全的特点&#xff0c;被广泛应用于Web应用的用户身份验证和信息交换。 一、JWT的原理 JWT是一个开…

Jmeter基础(1) Mac下载安装启动

目录 Jmeter下载安装启动下载启动 Jmeter下载安装启动 注意⚠️&#xff1a;使用jmeter需要有java环境 下载 官网下载地址&#xff1a;https://jmeter.apache.org/ 会看到这里有两个版本&#xff0c;那么有什么区别么&#xff1f; Binaries是可执行版&#xff0c;直接下载解…

phpspreadsheet导出数据和图片到excel

仅作记录&#xff0c;废话不多说 前提是已经安装了phpspreadsheet &#xff08; composer require phpoffice/phpspreadsheet &#xff09; 一、 数据拼装&#xff0c;调用excel类 <?php /*** 电子台账* Date: 2023/4/20* Time: 17:28*/namespace app\store\controlle…

Unity编辑器内工程文件重命名|Project视图文件名修改

Unity编辑器内文件重命名 前言大项内容一使用方法代码展示 总结 前言 本文代码可以一键更改Project视图的文件名字 在当前文件名的状态下增加一段字符区分文件。 大项内容一 功能是因为在给其他人导入项目资源时有重复的资源的时候&#xff0c;资源会产生覆盖的问题。所以直…

Suse 12更新操作系统Openssl(3.2.0)、OpenSSH(9.6p1)及ntp(4.2.8p17)(源码编译安装)

部署前准备 安装依赖 zypper install -y gcc gcc-c glibc make autoconf openssl openssl-devel pcre-devel pam-develzypper install -y pam* zlib*SUSE的pam模块支持与其他Linux不同&#xff0c;请按需检查 openssh-9.6p1.tar.gzopenssl-3.2.0.tar.gzzlib-1.3.1.tar.gz&…

上进计划 | Python爬虫经典实战项目——电商数据爬取!

电商数据采集之——电商数据爬虫|电商数据采集API接口 电商数据爬虫背景 在如今这个网购风云从不间歇的时代&#xff0c;购物狂欢持续不断&#xff0c;一年一度的“6.18年中大促”、“11.11购物节”等等成为了网购电商平台的盛宴。在买买买的同时&#xff0c;“如何省钱&#…