C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程

目录

  • 一.前言
  • 二.函数不定长参数简介
    • 1.va_start
    • 2.va_arg
    • 3.va_end
  • 三.win32 控制台版本
  • 四.MFC 对话框版本
  • 五.猜你喜欢

零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

一.前言

printf 函数的使用,我们并不陌生,首先我们来看看下面关于 printf 函数的几种调用方式:

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 va_start / va_end / va_arg 自定义 printf 函数
//@Time:2021/07/10 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/printf("hello world");
printf("%s","hello world");
printf("%s %s","hello world","C语言教程-猿说编程");
printf("%d",3);
printf("%d %d",3,6);
printf("%d %d %d ",1,2,3);

灵魂拷问:

  • 1.printf 函数到底参数是什么类型?
  • 2.printf 函数到底有几个参数?

二.函数不定长参数简介

关于 C 语言的不定长参数使用,必然离不开三个宏:**`` **[`va_start`](https://www.codersrc.com/archives/9517.html)、[`va_arg`](https://www.codersrc.com/archives/9530.html)、[`va_end`](https://www.codersrc.com/archives/9528.html)** ``**

#include <stdarg.h>
#define va_start __crt_va_start
#define va_arg   __crt_va_arg
#define va_end   __crt_va_end

1.va_start

#include <stdarg.h>//必须包含头文件
/*
*   arg_ptr 指向函数参数列表中的第一个可选参数
*   argN  是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数
*/
va_start(arg_ptr, argN)

2.va_arg

#include <stdarg.h>//必须包含头文件
/*
*   返回参数列表中指针arg_ptr所指的参数, 返回类型为type.
*   并使指针arg_ptr指向参数列表中下一个参数.
*   返回的是可选参数, 不包括固定参数.
*/
va_arg(arg_ptr, type)

3.va_end

#include <stdarg.h>//必须包含头文件
/*
*   清空参数列表, 并置参数指针arg_ptr无效.
*/
va_end(arg_ptr)

三.win32 控制台版本

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 va_start / va_end / va_arg 自定义 printf 函数
//@Time:2021/07/10 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/#include <stdio.h>
#include <stdarg.h>void WriteFrmtd(char *format, ...)
{va_list args;va_start(args, format);vprintf(format, args);va_end(args);
}int main ()
{WriteFrmtd("%d variable argument\n", 1);WriteFrmtd("%d variable %s\n", 2, "arguments");return(0);
}
/*
输出:1 variable argument
2 variable arguments
请按任意键继续. . .
*/

四.MFC 对话框版本

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 va_start / va_end / va_arg 自定义 printf 函数
//@Time:2021/07/10 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/BOOL printDebugMsgA(CHAR *format, ...)
{CHAR buf[1024] = { 0 };CHAR out[2048] = { 0 };time_t timep;struct tm p;time(&timep);localtime_s(&p, &timep);va_list args;va_start(args, format);vsprintf_s(buf, format, args);va_end(args);sprintf_s(out, "[%d-%d-%d %d:%d:%d ]: %s \n", 1900 + p.tm_year, 1 + p.tm_mon, p.tm_mday, p.tm_hour, p.tm_min, p.tm_sec, buf);OutputDebugStringA(out);return TRUE;
}
BOOL printDebugMsgW(WCHAR *format, ...)
{WCHAR buf[2048] = { 0 };WCHAR out[2048] = { 0 };time_t timep;struct tm p;time(&timep);localtime_s(&p, &timep);va_list args;va_start(args, format);vswprintf_s(buf, 2048, format, args);va_end(args);wsprintf(out, L"[%d-%d-%d %d:%d:%d ]: %s \n", 1900 + p.tm_year, 1 + p.tm_mon, p.tm_mday, p.tm_hour, p.tm_min, p.tm_sec, buf);//wsprintf(out, L"%s", buf);OutputDebugStringW(out);return TRUE;
}printDebugMsgA("猿说编程 %s %d %f", "xia处理", 1991, 1775.5);
printDebugMsgW(L"猿说编程 %s %d %f", L"xia处理", 1991, 1775.5);/*
输出:[2020-5-29 11:37:45 ]: 猿说编程 xia处理 1991 1775.500000
[2020-5-29 11:37:45 ]: 猿说编程 xia处理 1991 1775.500000
*/

五.猜你喜欢

  1. C 语言 数组下标越界和内存溢出区别
  2. C 语言 使用指针遍历数组
  3. C 语言 指针和数组区别
  4. C 语言 指针数组和数组指针区别
  5. C 语言 野指针
  6. C 语言 函数值传递和址传递
  7. C 语言 函数不定长参数
  8. C 语言 函数指针
  9. C 语言 指针函数
  10. C 语言 回调函数 callback
  11. C 语言 #pragma once
  12. C 语言 #include <> 与 #include “” 区别
  13. C 语言 const 修饰函数参数
  14. C 语言 const 和 define 区别
  15. C 语言 #运算符
  16. C 语言 ##运算符
  17. C 语言 __VA_ARGS__
  18. C 语言 ##__VA_ARGS__
  19. C 语言 函数不定长参数 ##__VA_ARGS__经典案例
  20. C 语言 va_start 宏
  21. C 语言 va_end 宏
  22. C 语言 va_arg 宏
  23. C 语言 vprintf 函数
  24. C 语言 va_start / va_end / va_arg 自定义 printf 函数

未经允许不得转载:猿说编程 » C 语言 va_start / va_end / va_arg 自定义 printf 函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524809.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes API 与 Operator:不为人知的开发者战争

戳蓝字“CSDN云计算”关注我们哦&#xff01;前情回顾&#xff1a;《Kubernetes API 与 Operator&#xff1a;不为人知的开发者战争&#xff08;上&#xff09;》2016 年秋天&#xff0c;原 CoreOS 公司的工程师邓洪超像往常一样&#xff0c;来到了同事位于福斯特城&#xff08…

jq之$(“:button“)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>点击p段落&#xff0c;把它们隐藏</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js">&…

要闻君说:国产5G 手机只比普通版手机贵500元?菜鸟物联网机器人分拨中心首落南京!亚马逊推出的AWS集中式备份服务来啦!...

关注并标星星CSDN云计算每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 嗨&#xff0c;大家好&#xff01;偶是要闻君。借着自家年会即将开幕的兴奋劲&#xff0c;继续给各位看官们带来最新、最扎眼的泛云圈大新闻&#xff0c;还是先听首歌曲&#xff0c…

jq之$(“a[target=‘_blank‘]“)不隐藏

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>jq之demo</title><!--线上jq库--><script src"https://code.jquery.com/jquery-3.4.1.min.js"></script><scrip…

Spring精华问答 | 什么是Spring Cloud?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Spring是为解决企业应用程序开发复杂性而创建的一个Java开源框架&#xff0c;应用非常广泛。业内非常流行的SSH架构中的其中一个"S"指的就是Spring。今天我们就一起来看看关于Spring的精华问答&#xff01;1Q&#xff1a;…

C语言 main 函数 - C语言零基础入门教程

目录 一.main 函数简介二.main 函数写法三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.main 函数简介 main 函数是 C 程序的入口函数&#xff0c;即程序的执行是从 main 函数开始&#xff0c;对其他函数的调动也是直接或间接地在 main 函数…

要闻君说:必应(Bing)搜索引擎已在国内被屏蔽;Verizon媒体业务宣布裁员7%;小米率先发布折叠屏手机...

关注并标星星CSDN云计算每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 嗨&#xff0c;大家好&#xff01;偶是要闻君。年底新闻一箩筐果真眼见为实&#xff0c;绝对不假。无论是华为天罡出师再添5G风采&#xff0c;还是小米自研折叠手机惊艳于世&#x…

自定义异常小结

package com.wuming.exception; //自定义的异常类 public class MyException extends Exception{//传递数字>10;private int detail;public MyException(int a) {this.detail a;}//toString 异常的打印信息Overridepublic String toString() {return "MyExceptin{&quo…

多线程:继承Thread

package com.wuming.demo01; //创建线程方式一&#xff1a;继承Thread类&#xff0c;重写run()方法&#xff0c;调用start开启线程 //总结&#xff1a;线程开启不一定立即执行&#xff0c;由cpu调度执行 public class TestThread1 extends Thread{Overridepublic void run() {/…

高晓松侃5G!2019开年大讲揭示运营商的秘密

戳蓝字“CSDN云计算”关注我们哦&#xff01;文章来自&#xff1a;通信世界日前&#xff0c;著名音乐创作人、电影创作人、自带清华才子光环的高晓松回归母校&#xff0c;竟做了一场没有“诗和远方”全是5G的演讲&#xff01;他演讲的主题是——《5G与区块链&#xff1a;文创产…

java设计模式-简单工厂模式

1.实例化对象不需要new&#xff0c;用工厂模式 2.工厂模式分为&#xff08;简单工厂模式&#xff0c;工厂方法模式&#xff0c;抽象工厂模式&#xff09; package com.wuming.factory.simple;public interface Car {public void name(); }package com.wuming.factory.simple;…

容器精华问答 | Docker和虚拟机有什么差别?

戳蓝字“CSDN云计算”关注我们哦&#xff01;容器技术是这两年热门的话题&#xff0c;因为容器技术给我们带来了很多方便的地方&#xff0c;节约了不少成本&#xff0c;不管是在运维还是开发上。今天&#xff0c;就让我们来看看关于容器更加有深度的问题吧。1Q&#xff1a;宿主…

云漫圈 | finally到底是在return之前执行还是return之后执行?

戳蓝字“CSDN云计算”关注我们哦&#xff01;文章来自&#xff1a;程序员乔戈里作者&#xff1a;乔戈里qgl——下课后——public class Main { public static void main(String[] args) { query(); } public static void query() { int i 0; try { …

C语言 NULL 和 0 区别 - C语言零基础入门教程

目录 一.关于 NULL 定义二.NULL 和 0 区别三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.关于 NULL 定义 NULL 在 stdio.h 中定义如下&#xff1a; #if !defined(NULL) && defined(__NEEDS_NULL) #ifdef __cplusplus #define NUL…

5G大规模商用来临之前,你必须知道的几个知识点

戳蓝字“CSDN云计算”关注我们哦&#xff01;大数据文摘授权翻译自纽约时报编译&#xff1a;雪清、蒋宝尚当人们在谈论人工智能和自动驾驶的时候&#xff0c;总是离不开5G。要说4G的侧重点是人与人之间不同方式的通信&#xff0c;那么5G将要形成的端到端生态系统&#xff0c;能…

C语言 全局变量 - C语言零基础入门教程

目录 一.全局变量简介二.全局变量使用三.全局变量使用注意事项四.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.全局变量简介 在所有函数外部定义的变量称为全局变量&#xff08;Global Variable&#xff09;&#xff0c;它的作用域默认是从…

趣挨踢 | 阿里员工吐槽:我在阿里工作五年,面试一个小公司竟然挂了

戳蓝字“CSDN云计算”关注我们哦&#xff01;来自&#xff1a;互联网坊间八卦一名阿里员工在互联网社区吐槽&#xff0c;称自己工作经验丰富&#xff0c;在阿里工作了五年&#xff0c;去面试一个小互联网创业公司竟然挂了&#xff0c;真是无力吐槽&#xff1a;我就郁闷了&#…

多线程:实现Runnable接口

package com.wuming.demo01; //创建线程方式2&#xff0c;实现runnable接口&#xff0c;重写run&#xff08;&#xff09;&#xff0c;执行线程需要丢入runnable接口实现类&#xff0c;调用start方法 public class TestThread3 implements Runnable{Overridepublic void run() …

要闻君说:亚马逊也进击开源了吗?微软收购开源软件公司Citus Data,剑指云服务!投资15亿的数据中心忠德粤桂云来了!...

关注并标星星CSDN云计算每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 嗨&#xff0c;大家好&#xff01;偶是要闻君。工作日的最后一周&#xff0c;有没有很兴奋&#xff1f;边学习边听歌吧&#xff01;文/要闻君近日&#xff0c;AWS宣布推出Neo-AI项目…

C语言 局部变量 - C语言零基础入门教程

目录 一.局部变量简介二.局部变量注意事项三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础入门 一.局部变量简介 定义在函数内部的变量称为局部变量&#xff08;Local Variable&#xff09;&#xff0c;它的作用域仅限于函数内部&#xff0c; 离开该…