C 可变参数

C语言中的可变参数(variable arguments)是一种特殊的参数类型,可以允许函数接受不确定数量的参数。可变参数的使用需要引入 C 标准库的stdarg.h头文件,并且需要使用固定格式的函数。

可变参数函数的定义

可变参数函数的定义需要以下三个步骤:

  1. 定义函数传入的最后一个参数,以便在函数中定位可变参数的起始位置。

C
int function_name(int par1, int par2, ...)
{
...
}

  1. 定义va_list类型变量,在函数内部使用va_start初始化它。

C
va_list ap;
va_start(ap, p2);

va_start函数的第二个参数是可变参数列表的前一个参数,用于确定参数列表的位置,即可变参数的开始位置。返回的指针将指向此参数(也就是第一个可变参数的位置)。

  1. 使用va_arg宏读取可变参数的值,并使用va_end释放ap。

C
int value1 = va_arg(ap, int); // 读取第一个可变参数
double value2 = va_arg(ap, double); // 读取第二个可变参数
...
va_end(ap);

可变参数函数的调用

可变参数函数调用需要按照三个步骤执行:

  1. 使用函数名和其他参数列表调用函数:

C
result = function_name(p1, p2, ...);

  1. 在需要多传递参数的位置传递额外的参数。

C
result = function_name(p1, p2, p3, p4, ...);

3.保证在固定参数之后传递的所有参数都是该函数期望接收的类型的参数。

示例1:计算可变参数的平均值

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

double average(int num, ...)
{
    va_list valist;
    double sum = 0.0;
    int i;
    va_start(valist, num);
    for (i = 0; i < num; i++)
    {
        sum += va_arg(valist, int);
    }
    va_end(valist);
    return sum / num;
}

int main()
{
    printf("Average of 2,3,4,5 = %f\n", average(4, 2, 3, 4, 5));
    printf("Average of 5,10,15 = %f\n", average(3, 5, 10, 15));
    return 0;
}

输出:

Average of 2,3,4,5 = 3.500000
Average of 5,10,15 = 10.000000

示例2:字符串连接

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

char* concat(int count, ...)
{
    va_list args;
    va_start(args, count);

    size_t len = 1;
    for (int i = 0; i < count; i++) {
        len += strlen(va_arg(args, char*));
    }

    char* new_str = (char*)malloc(len * sizeof(char));

    va_start(args, count);
    new_str[0] = '\0';
    for (int i = 0; i < count; i++) {
        strcat(new_str, va_arg(args, char*));
    }

    va_end(args);
    return new_str;
}

int main()
{
    char *s1 = "Hello";
    char *s2 = " World";
    char *s3 = "!";
    char *result = concat(3, s1, s2, s3);
    printf("%s\n", result);
    free(result);
    return 0;
}

输出:

Hello World!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C 可变参数 - Python技术站

(0)
上一篇 2023年5月10日
下一篇 2023年5月10日

相关文章

  • 详解C++编程中的vector类容器用法

    详解C++编程中的vector类容器用法 简介 在 C++ 中,vector 是一个非常实用的容器类,它可以动态调整大小并提供了一系列方便的操作函数。在本文中,我们将详细介绍 vector 类的使用方法,以便能够更好地应用 vector 容器类进行 C++ 编程。 如何使用 vector 首先需要在头文件中包含 vector: #include<vec…

    C 2023年5月22日
    00
  • c++容器list、vector、map、set区别与用法详解

    C++容器list、vector、map、set区别与用法详解 C++容器是C++标准库提供的一些数据结构,包括vector、list、map、set等。这些容器在我们编写代码时,经常会被用到。针对不同的应用场景,我们会选择不同的容器。本文将对C++中常用的四种容器:list、vector、map、set做一个详细介绍,分别介绍其区别和用法。 List li…

    C 2023年5月22日
    00
  • 联想小新Pro 13笔记本怎么样 联想小新Pro 13笔记本拆机+评测

    联想小新Pro 13 笔记本 联想小新Pro 13 笔记本是一款轻薄便携的高性能笔记本电脑,采用了第8代英特尔酷睿i5/i7处理器、全新独立显卡和全高清显示屏等最新的硬件配置,极大地提升了其性能和使用体验。同时,联想小新Pro 13 笔记本还拥有不错的外观设计和使用续航能力,深受广大用户的喜爱。 联想小新Pro 13 笔记本拆机 步骤1 – 拆卸电池 首先关…

    C 2023年5月22日
    00
  • C 标准库 ctype.h

    ctype.h 是 C 标准库中的一个头文件,提供了一些用于字符处理的函数。这里详细讲解一下它的使用方法。 ctype.h 头文件的引入 为了使用 ctype.h 头文件,需要在程序中包含它。可以使用以下代码引入: #include <ctype.h> 一些常用的 ctype.h 函数 isalnum() 此函数用于检查字符是否是字母或数字。如果…

    C 2023年5月10日
    00
  • C++演讲比赛管理系统实现流程实例

    C++演讲比赛管理系统实现流程实例 系统需求 演讲比赛管理系统要求具有以下功能: 实现学生信息的录入:包括学号、姓名、年龄等信息。 实现教师信息的录入:包括工号、姓名、年龄、职称等信息。 实现选手报名:包括姓名、年龄、比赛成绩等信息。 实现比赛的评分:包括裁判打分、选手得分等信息。 实现比赛成绩的排序和输出:包括选手名次、得分等信息。 类的设计 根据系统需求…

    C 2023年5月23日
    00
  • js 递归json树实现根据子id查父id的方法分析

    下面我将介绍如何用JavaScript递归JSON树实现根据子ID查找父ID的方法。具体步骤如下: 步骤一:构造JSON树形结构 首先,我们需要构造一棵JSON树形结构。下面是一个示例: [ { "id": 1, "name": "父节点1", "children": [ { &…

    C 2023年5月23日
    00
  • c语言printf实现同一位置打印输出的实例

    下面是关于C语言中printf函数实现同一位置打印输出的攻略。 1. 实现同一位置输出的基本思路 C语言中的printf函数可以支持在同一位置多次打印输出。实现同一位置输出的基本思路如下: 利用转义字符\r将光标移动到一行的起始位置; 在同一行内不断输入新的内容,利用转义字符\b将光标不断左移; 在新的内容输入完毕后,利用空格将后面多余的内容覆盖掉。 具体实…

    C 2023年5月22日
    00
  • C++ STL标准库std::vector扩容时进行深复制原因详解

    C++ STL标准库std::vector是一个提供动态数组功能的容器,它提供了扩容机制,即当当前存储的元素个数达到容量限制时,会自动将容量扩大一倍,以适应更多元素的存储。但在扩容的过程中,每一个元素都必须进行深复制操作,这是因为在动态内存分配中,变量在内存中的位置不连续,因此需要将每个元素重新复制到新的内存位置上。 下面以两个简单示例详细说明std::ve…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部