1. va_list相关函数的学习:

va_list是一种变参量的指针类型定义.

va_list使用方法如下:

1)首先在函数中定义一个具有va_list型的变量,这个变量是指向参数的指针。

2)首先在函数中定义一个具有va_list型的变量,这个变量是指向参数的指针。

3)然后va_arg返回可变参数,va_arg的第二个参数是你要返回的参数的类型(如果多个可变参数,依次调用va_arg获取各个参数)。

4)最后使用va_end宏结束可变参数的获取。

在使用va_list是应该注意一下问题:

1)  可变参数的类型和个数完全由代码控制,它并不能智能地识别不同参数的个数和类型。

2)  如果我们不需要一一详解每个参数,只需要将可变列表拷贝到某个缓冲区,可以用vsprintf函数。

3)  因为编译器对可变参数的函数原型检查不够严格,对编程查错不利,不利于我们写出高质量的代码。
Coding:
#include "stdarg.h"
#include <iostream>
#include <stdio.h> static char buf[];
int sum(char* msg, ...); int main(void)
{
int total = ;
char str[] = "%dhello%dworld!%d";
total = sum(str, , , );
std::cout << "total = " << total << std::endl;
return ;
} int sum(char* msg, ...)
{
va_list vaList; //定义一个具有va_list型的变量,这个变量是指向参数的指针。
va_start(vaList, msg);//第一个参数指向可变列表的地址,地址自动增加,第二个参数位固定值
std::cout << msg << std::endl;
int sumNum = ;
int step,i; vsnprintf(buf,sizeof(buf),msg,vaList); for(i=;i<;i++){
printf("%c",buf[i]);
}
while ( != (step = va_arg(vaList, int))) //va_arg第一个参数是可变参数的地址,第二个参数是传入参数的类型,返回值就是va_list中接着的地址值,类型和$
{ //va_arg 取得下一个指针
//不等于0表示,va_list中还有参数可取
sumNum += step;
}
va_end(vaList);//结束可变参数列表
return sumNum;
}

运行结果:
hello world

total=6

Reference:

a. https://www.cnblogs.com/qiwu1314/p/9844039.html

C语言特殊函数的应用的更多相关文章

  1. Go语言特殊函数介绍

    main 函数 Go语言程序的默认入口函数(主函数):func main()函数体用{}一对括号包裹.只能应用于package main func main(){ //函数体 } init 函数 go ...

  2. Go语言目录

    为什么学习Go语言 第一章 环境搭建 Windows搭建Go语言环境 第二章 Go语言基础 Go语言介绍 Go语言命名 Go语言内置类型和函数 Go语言特殊函数介绍 Go语言运算符 第三章 Go语言程 ...

  3. 08.C语言:特殊函数

    C语言:特殊函数 1.递归函数: 与普通函数比较,执行过程不同,该函数内部调用它自己,它的执行必须要经过两个阶段:递推阶段,回归阶段: 当不满足回归条件,不再递推: #include <stdi ...

  4. C语言与C++语言之间关系

    很多时候我们对于C和C++的区别不是很清楚,以至于弄混的情况并不少见.那C语言和C++语言到底是怎么回事呢? 首先,我们来看下百度百科对语言和C++语言描述,相对而说也还算是比较权威的. C语言 C语 ...

  5. 数字信号处理专题(2)——利用FPGA进行基本运算及特殊函数定点运算

    一.前言 FPGA以擅长高速并行数据处理而闻名,从有线/无线通信到图像处理中各种DSP算法,再到现今火爆的AI应用,都离不开卷积.滤波.变换等基本的数学运算.但由于FPGA的硬件结构和开发特性使得其对 ...

  6. 2017第八届蓝桥杯C/C++语言A组

    一:题目: 标题:迷宫 X星球的一处迷宫游乐场建在某个小山坡上.它是由10x10相互连通的小房间组成的. 房间的地板上写着一个很大的字母.我们假设玩家是面朝上坡的方向站立,则:L表示走到左边的房间,R ...

  7. C语言 · 还款计算

    标题: 还款计算 银行贷款的等额本息还款方法是: 每月还固定的金额,在约定的期数内正好还完(最后一个月可能会有微小的零头出入). 比如说小明在银行贷款1万元.贷款年化利率为5%,贷款期限为24个月. ...

  8. C语言 · 滑动解锁

    题目:滑动解锁 滑动解锁是智能手机一项常用的功能.你需要在3x3的点阵上,从任意一个点开始,反复移动到一个尚未经过的"相邻"的点.这些划过的点所组成的有向折线,如果与预设的折线在图 ...

  9. Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】

    原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...

随机推荐

  1. elk报错解决

    .elasticsearch启动失败如下: [root@bogon home]# /home/elasticsearch-/bin/elasticsearch [--11T07::,][WARN ][ ...

  2. php7与其他版本共存

    转自: https://zhangge.net/5088.html php7编译安装 https://zhangge.net/5075.html

  3. 导出设计文档总结 plantUML Graphviz jacob

    plantUML https://blog.csdn.net/HelloWorld998/article/details/90676496 http://skyao.github.io/2014/12 ...

  4. java 与 c# 3des 加解密

    java 与 c# 3des 加解密   主要差异如下: 1.  对于待加密解密的数据,各自的填充模式不一样 C#的模式有:ANSIX923.ISO10126.None.PKCS7.Zero,而Jav ...

  5. springboot-RequestMappingHandlerMapping

    作用:查看应用请求对应的ur和方法l情况 实例: RequestMappingHandlerMapping mapping =applicationContext.getBean("requ ...

  6. git合并时忽略某个文件

    因为开发现场跟部署的环境不同,有很多ip地址每次都要改来改去;于是开两个分支master(用来保存部署现场的ip)和dev(开发环境的ip),开发功能时在dev分支,然后使用master合并,每个分支 ...

  7. Unreal Engine* 4.19 的 CPU 功能检测

    随着现代 CPU 内核数量的增加,可以拥有更多的游戏功能.但是,相比配备高端系统的玩家,内核数量较少的玩家可能会处于劣势.为了缩小这种差距,可以使用 C++ 和蓝图划分特性.这样可以实现最大的 CPU ...

  8. 【科普杂谈】IP地址子网划分

    1.学习子网前的准备知识-什么是数制 现场讲解版 二进制和十进制的关系   二进制和十六进制的关系  16进制的每个位是2进制的4位 F=1111  二进制转16进制,按上面4位一组分开转 2.IP地 ...

  9. JDBC ----- SQL 插入记录

    package demo; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; ...

  10. 截取铃声python代码

    from pydub import AudioSegment file_name = "张杰 - 这就是爱.mp3" sound = AudioSegment.from_mp3(f ...