目錄
- 一.前言
- 二.函式不定長引數簡介
- 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
*/
五.猜你喜歡
- C 語言 陣列下標越界和記憶體溢位區別
- C 語言 使用指標遍歷陣列
- C 語言 指標和陣列區別
- C 語言 指標陣列和陣列指標區別
- C 語言 野指標
- C 語言 函式值傳遞和址傳遞
- C 語言 函式不定長引數
- C 語言 函式指標
- C 語言 指標函式
- C 語言 回呼函式 callback
- C 語言 #pragma once
- C 語言 #include <> 與 #include “” 區別
- C 語言 const 修飾函式引數
- C 語言 const 和 define 區別
- C 語言 #運算子
- C 語言 ##運算子
- C 語言 __VA_ARGS__
- C 語言 ##__VA_ARGS__
- C 語言 函式不定長引數 ##__VA_ARGS__經典案例
- C 語言 va_start 宏
- C 語言 va_end 宏
- C 語言 va_arg 宏
- C 語言 vprintf 函式
- C 語言 va_start / va_end / va_arg 自定義 printf 函式
未經允許不得轉載:猿說編程 ? C 語言 va_start / va_end / va_arg 自定義 printf 函式
本文由博客 - 猿說編程 猿說編程 發布!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/301150.html
標籤:C
