日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C打印函数printf的一种实现原理简要分析

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C打印函数printf的一种实现原理简要分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【0】README

  • 0.1)本文旨在對 printf 的 某一種 實現 原理進行分析,做了解之用;
  • 0.2) vsprintf 和 printf.c 的源碼,參見
    https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/p309

【1】printf函數代碼分析:

https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/p309/printf.c

  • P1)line66: va_list arg = (va_list)((char*)(&fmt) + 4); 要知道,對于C函數的調用,壓棧順序是從右參數往左邊參數壓棧,最右邊參數最先壓棧,最左邊參數最后壓棧;當然, (&fmt+4)指向的是 printf參數列表中 “…” 的首地址, 而“…” 代表的是參數列表(低地址到高地址,因為壓棧順序就是從高地址到低地址壓棧):MAG_CH_ASSERT, exp, file, base_file, line ;
  • P2)結合以上敘述,我們得到 buf 就是個字符串數組(可以看做緩沖區)、 fmt = “%c assert(%s) failed: file: %s, base_file: %s, ln%d” 、arg = MAG_CH_ASSERT, exp, file, base_file, line 五個參數列表(即長度為5的20字節數組,每個地址4個字節);

【2】vsprintf 函數代碼分析:

https://github.com/pacosonTang/dataStructure-algorithmAnalysis/blob/master/p309/vsprintf.c

  • V1)line68: 調用 vsprintf 函數,同樣的,參數壓棧順序是從右往左壓棧, 我們看看vsprintf 的源碼, 結合源碼,我們的分析如下:

    • V1.1)line57~60 :非找到 fmt 中的 % 不可(%是定義輸出格式的標識符), 且fmt 的字符是一個一個copy 到buf 的;
    • V1.2)line87~113:從參數列表 p_next_arg = args 中 抽取出 格式字符串,用q = inner_buf 來存儲這些參數值;(顯然,i2a()函數是 數字輸出的不同進制的轉換,16進制、10進制等),p_next_arg += 4; p_next_arg 為什么自加4 ,不用我多說了吧;
    • V1.3)line119~122:用inner_buf 存儲的格式輸出值 去填充 %定義的格式輸出;
  • V2)再看看 vsprintf 對于 輸出格式寬度是如何處理的?如%10d,等等;

    • V2.1)line62 :將align_nr 初始化為 0;
    • V2.2)line67~77: 是在 對 %下一個字符出現的可能情況的處理: 如果有兩個 %% 并排,則表明輸出為%、如果為0,待會cs=0、如果是其他情況,cs=空格;
    • V2.3)line78~82: 是在對 % 下一個字符是數字(打印寬度)的處理;
    • V2.4)line115~118:將cs 的值賦給 緩沖區 buf, 這里應該是把空格賦值過去,以填充打印寬度(說實話,這里我也沒有好懂, 不過printf 的 實現步驟的大致方向清楚了);

總結

以上是生活随笔為你收集整理的C打印函数printf的一种实现原理简要分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。