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++ printf族函数 -> 正文阅读

[C++知识库]C++ printf族函数

1、所有的printf族函数

有两大类:

#include<stdio.h>
int printf(const char* format, ...);
int fprintf(FILE* stream, const char* format, ...);
int dprintf(int fd, const char* format, ...);
int sprintf(char* str, const char* format, ...);
int snprintf(char* str, size_t size, const char* format, ...);
#include<stdarg.h>
int vprintf(const char* format, va_list ap);
int vfprintf(FILE* stream, const char* format, va_list ap);
int vdprintf(int fd, const char* format, va_list ap);
int vsprintf(char* str, const char* format, va_list ap);
int vsnprintf(char* str, size_t size, const char* format, va_list ap);

从函数名来看,下面的函数的名字都比上面多一个字母 v
从参数类型来看,下面函数的最后一个参数都是va_list类型。
下面的函数在功能上与上面的函数一 一对应。

2、前驱知识

本小节从从最基础的 printf 入手,来讲解学习这些函数需要的前驱知识。

2.1 什么是: 格式化字符串format

这个其实我们每天都在用,只是不知道他叫这个名字。

int a = 1;
double b = 3.14;
printf("a = %d, b = %llf\n", a, b);

结合上面printf函数的定义可知, "a = %d, b = %llf\n" 其实就是格式化字符串,即,参数format的内容。而ab合起来是可变参数参数,即,参数...的内容。

2.2 va_list是什么类型

va_list 是可变参数列表类型,它的含义和...一样,都是代表很多个参数。但它们的区别也很大。

准确来说 ...并不能算作一种类型,他只是在视觉上告诉我们这后面可以传入可变参数。而在函数的实现中我们并不能直接使用...作为参数名来使用这些可变参数。那,我们想自己实现一个形如 my_printf(const char* format, ...) 的函数该怎么办呢??

va_list 类型就是用来解决这个问题的。在函数体中,我们使用va_list类型的一个参数就可以代表...中所有的可变参数。

好嘞,本小节标题的问题解决了。

3、可变参数列表(va_list)怎么用?

3.1 va_list族函数

#include<stdarg.h>
void va_start(va_list ap, last);	
type va_arg(va_list ap, type);
coid va_end(va_list ap);
void va_copy(va_list dest, va_list src);

3.2 这些函数怎么用

直接以一个实际应用中的例子来说明。现在,我们的程序中需要一个这样的函数:func(int a, double b, ...);

首先,在函数体中定义一个va_list类型的变量:va_list arg_list;

此时arg_list还未初始化,类似一个空指针,接下来要把这个空指针指定到需要的位置。va_start函数就用来完成这件事,使用va_list类型时,该函数必须第一个被调用:
va_start(arg_list, b);
调用该函数后,arg_list就能代表传入func所有可变参数。va_start函数中,参数last没有类型,就是一个参数名,他是fun中最后一个类型已知的参数的名字,本例中就是b

然后,arg_list就能正式投入使用了。我们既可以将他看作一个整体,传入printf函数的第二个参数,也可以把可变参数一个一个取出来用。
先来看前者:直接这样:printf(" 这里是格式化字符串 ", arg_list);
后者要复杂一些,需要使用va_arg函数。进行 va_arg(arg_list, int) 调用就是从开始位置返回一个int(可能不是int类型,根据实际情况确定类型),并把位置往前推1,下次调用该函数就返回后面的那个参数。这样访问需要提前知道可变参数的数量,类型以及顺序。

va_arg函数本身并不知道在哪里结束,所以用while(1){ var_arg(args,int);} 会无限循环直到内存访问越界程序coredump。 最好就在传参时传入一个专门用于标识结尾的参数 比如12345678 。当返回值等于标识数时,结束访问。

访问完毕后,必须使用va_end函数销毁刚刚初始化的arg_listva_end(arg_list);

3.3 总结

va_start:初始化(指定位置)
va_arg:遍历访问
va_end:销毁
va_copy:复制

4、再看printf族函数

#include<stdio.h>
int printf(const char* format, ...);				将输出写入标准输出 stdout
int fprintf(FILE* stream, const char* format, ...);	将输出写入给定的输出流
int dprintf(int fd, const char* format, ...);		将输出写入文件描述符
int sprintf(char* str, const char* format, ...);	将输出写入字符串
int snprintf(char* str, size_t size, const char* format, ...);	将定长输出写入字符串

使用va_list类型的函数功能与上面的一 一对应,只是在调用时,把上面的...变量用va_list变量替代。

#include<stdarg.h>
int vprintf(const char* format, va_list ap);
int vfprintf(FILE* stream, const char* format, va_list ap);
int vdprintf(int fd, const char* format, va_list ap);
int vsprintf(char* str, const char* format, va_list ap);
int vsnprintf(char* str, size_t size, const char* format, va_list ap);
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-21 18:44:48  更:2022-05-21 18:45:03 
 
开发: 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/23 18:31:30-

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