C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程
生活随笔
收集整理的這篇文章主要介紹了
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_end1.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 */五.猜你喜歡
未經允許不得轉載:猿說編程 ? C 語言 va_start / va_end / va_arg 自定義 printf 函數
總結
以上是生活随笔為你收集整理的C语言 va_start / va_end / va_arg 自定义 printf 函数 - C语言零基础入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 线程池 ThreadPoo
- 下一篇: 重写详细讲解