C語言 va_start / va_end / va_arg 自定義 printf 函數(shù) - C語言零基礎(chǔ)入門教程

目錄

零基礎(chǔ) C/C++ 學(xué)習(xí)路線推薦 : C/C++ 學(xué)習(xí)目錄 >> C 語言基礎(chǔ)入門

一.前言

printf 函數(shù)的使用,我們并不陌生主巍,首先我們來看看下面關(guān)于 printf 函數(shù)的幾種調(diào)用方式:

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 va_start / va_end / va_arg 自定義 printf 函數(shù)
//@Time:2021/07/10 08:00
//@Motto:不積跬步無以至千里,不積小流無以成江海挪凑,程序人生的精彩需要堅(jiān)持不懈地積累孕索!
/******************************************************************************************/

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 函數(shù)到底參數(shù)是什么類型?
  • 2.printf 函數(shù)到底有幾個參數(shù)躏碳?

二.函數(shù)不定長參數(shù)簡介

關(guān)于 C 語言不定長參數(shù)使用搞旭,必然離不開三個宏:**`` **[`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 指向函數(shù)參數(shù)列表中的第一個可選參數(shù)
*   argN  是位于第一個可選參數(shù)之前的固定參數(shù), 或者說最后一個固定參數(shù)
*/
va_start(arg_ptr, argN)

2.va_arg

#include <stdarg.h>//必須包含頭文件
/*
*   返回參數(shù)列表中指針arg_ptr所指的參數(shù), 返回類型為type.
*   并使指針arg_ptr指向參數(shù)列表中下一個參數(shù).
*   返回的是可選參數(shù), 不包括固定參數(shù).
*/
va_arg(arg_ptr, type)

3.va_end

#include <stdarg.h>//必須包含頭文件
/*
*   清空參數(shù)列表, 并置參數(shù)指針arg_ptr無效.
*/
va_end(arg_ptr)

三.win32 控制臺版本

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 va_start / va_end / va_arg 自定義 printf 函數(shù)
//@Time:2021/07/10 08:00
//@Motto:不積跬步無以至千里肄渗,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累咬最!
/******************************************************************************************/

#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
請按任意鍵繼續(xù). . .
*/

四.MFC 對話框版本

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:C語言教程 - C語言 va_start / va_end / va_arg 自定義 printf 函數(shù)
//@Time:2021/07/10 08:00
//@Motto:不積跬步無以至千里翎嫡,不積小流無以成江海,程序人生的精彩需要堅(jiān)持不懈地積累永乌!
/******************************************************************************************/

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 語言 數(shù)組下標(biāo)越界和內(nèi)存溢出區(qū)別
  2. C 語言 使用指針遍歷數(shù)組
  3. C 語言 指針和數(shù)組區(qū)別
  4. C 語言 指針數(shù)組和數(shù)組指針區(qū)別
  5. C 語言 野指針
  6. C 語言 函數(shù)值傳遞和址傳遞
  7. C 語言 函數(shù)不定長參數(shù)
  8. C 語言 函數(shù)指針
  9. C 語言 指針函數(shù)
  10. C 語言 回調(diào)函數(shù) callback
  11. C 語言 #pragma once
  12. C 語言 #include <> 與 #include “” 區(qū)別
  13. C 語言 const 修飾函數(shù)參數(shù)
  14. C 語言 const 和 define 區(qū)別
  15. C 語言 #運(yùn)算符
  16. C 語言 ##運(yùn)算符
  17. C 語言 __VA_ARGS__
  18. C 語言 ##__VA_ARGS__
  19. C 語言 函數(shù)不定長參數(shù) ##__VA_ARGS__經(jīng)典案例
  20. C 語言 va_start 宏
  21. C 語言 va_end 宏
  22. C 語言 va_arg 宏
  23. C 語言 vprintf 函數(shù)
  24. C 語言 va_start / va_end / va_arg 自定義 printf 函數(shù)

未經(jīng)允許不得轉(zhuǎn)載:猿說編程 ? C 語言 va_start / va_end / va_arg 自定義 printf 函數(shù)

本文由博客 - 猿說編程 猿說編程 發(fā)布惑申!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末具伍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子圈驼,更是在濱河造成了極大的恐慌人芽,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绩脆,死亡現(xiàn)場離奇詭異萤厅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)靴迫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門惕味,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矢劲,你說我怎么就攤上這事赦拘。” “怎么了芬沉?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵躺同,是天一觀的道長。 經(jīng)常有香客問我丸逸,道長蹋艺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任黄刚,我火速辦了婚禮捎谨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憔维。我一直安慰自己涛救,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布业扒。 她就那樣靜靜地躺著检吆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪程储。 梳的紋絲不亂的頭發(fā)上蹭沛,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音章鲤,去河邊找鬼摊灭。 笑死,一個胖子當(dāng)著我的面吹牛败徊,可吹牛的內(nèi)容都是我干的帚呼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼集嵌,長吁一口氣:“原來是場噩夢啊……” “哼萝挤!你這毒婦竟也來了御毅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怜珍,失蹤者是張志新(化名)和其女友劉穎端蛆,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酥泛,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡今豆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了柔袁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呆躲。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖捶索,靈堂內(nèi)的尸體忽然破棺而出插掂,到底是詐尸還是另有隱情,我是刑警寧澤腥例,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布辅甥,位于F島的核電站,受9級特大地震影響燎竖,放射性物質(zhì)發(fā)生泄漏璃弄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一构回、第九天 我趴在偏房一處隱蔽的房頂上張望夏块。 院中可真熱鬧,春花似錦纤掸、人聲如沸脐供。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽患民。三九已至,卻和暖如春垦梆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仅孩。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工托猩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辽慕。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓京腥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親溅蛉。 傳聞我的和親對象是個殘疾皇子公浪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容