IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++】关于可变参数函数、vsprintf()函数、stdarg.h的宏函数使用 -> 正文阅读

[C++知识库]【C++】关于可变参数函数、vsprintf()函数、stdarg.h的宏函数使用

可变参数函数

  • C++允许定义形参个数和类型不确定的函数;
  • 在声明不确定形参可以使用省略号 ... 代替;
  • 故在函数调用是,不检查形参类型你是否与实参类型相同,也不检查参数个数;
  • 实例
void func(int i, ...);
  • 需要注意的是,编译器需要检查第一个参数,故第一个参数不可省略;
  • 对于可变参数的函数,需要进行特殊的处理。首先需要引用 <stdarg.h>头文件,然后利用va_list类型和va_start、va_arg、va_end 3个宏读取传递到函数中的参数值。

<stdarg.h>的宏函数

  • va_list数据类型,实际是char *数据类型;

va_arg()函数

  • 定义
type va_arg( va_list arg_ptr, type );
/*
*va_arg函数将返回 arg_ptr 所指位置的值,并将 arg_ptr 指向下一个参数
*/

va_start()函数

  • 定义
void va_start( va_list arg_ptr, prev_param );
/*
*va_start函数将参数arg_ptr设置为可变参数列表的第一个参数;
*参数arg_ptr的类型必须为va_list;
*数prev_param是在可变参数列表之前的那一个参数;
*/

va_end()函数

  • 定义
void va_end( va_list arg_ptr );
/*
*销毁所有参数,并将指向指针置空;
*/


vsprintf()函数

  • 定义
int vsnprintf( char* buffer, size_t buf_size, const char* format, va_list vlist );
  • vsnprintf() 函数将format 指向的字符串写入字符串缓冲区;
  • 可写入的最大字符数为 buf_size ;
  • 写入字符后,添加终止空字符;
  • 如果buf_size 等于零,则不写入任何内容并且buffer 可能是空指针;
  • 字符串格式可能包含以 % 开头的格式说明符,这些说明符被作为列表 vlist 传递的变量的值替换;
  • 在 头文件中定义;

实例

#include <stdio.h>
#include <stdarg.h>
#include <iostream>  
#define MAXLEN 10
 
int func(char* format, ...)
{
	char str[MAXLEN];
	int i = 0;
	va_list vArgList;
	va_start(vArgList, format);
	i = vsnprintf(str, MAXLEN, format, vArgList);
	va_end(vArgList);
	cout << str << endl;
	for (int j = 0; j < MAXLEN; j++)
	{
	     cout << str[j] << " ";
	}
	cout << endl;
	return i;
}
 
int main()
{
	int i = func("%s,%d,%d,%c", "abc", 1, 2, '\n'); 
    cout << i << endl;
	
	system("pause");
	return 0;
}
  • 结果
abc,1,2

97 98 99 44 49 44 59 44 10 0
9
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 20:30:30  更:2022-03-21 20:34:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:45:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码