C語言的printf列印中文是如何實現的?

時間 2021-06-01 09:02:12

1樓:zr scat

列印輸出來的是碼,解釋這個碼是終端的事情,所以自動解碼雙位元組碼還是unicode,然後選擇點陣字型檔還是向量字型檔,然後預設某個字型輸出,都是終端的事情,和printf沒有關係啊。

2樓:瘋狂的小牛

半夜醒來看到這個問題,激動啊,終於碰到乙個我能答的技術性問題了。因為自己親身寫過類似printf的函式,(scanf函式也寫保護過,不過都是那種簡化版的。)現在就讓我來具體解答一下他的工作機制是怎麼實現的。

我首先來簡單套講解我們自定義乙個add函式來實現我們基本兩整形數字想加功能時,計算機內部實行起來到底發生了什麼。拋磚引玉,然後再具體講解printf實現的工作機制,講兩個聯合起來理解就通俗易懂了。

其實,我們應該知道,簡單程式實際都是從main函式中跑起來的。假如我們在a.cpp檔案中定義了乙個int add(int a,int b)。

這樣,我們就可以直接在main函式中呼叫這個add函式,以達到我們完成兩個數進行想加的運算。

那麼,重點來了。程式是被載入到記憶體中執行的,程式執行流程起來的時候,它是依次執行main函式的語句。假設這時下一條語句呼叫add(3,4時)。

這時系統自動保留原來main函式的現場(這裡的現在指的是,在記憶體中存入eip,ebp,這樣程式在呼叫add函式結束後,還能知道怎麼返回到main函式中執行add函式下面未執行的語句。 )

函式是實行基本功能的最小模組單位,鄙人仿寫printf原型是 void myprintf(char *pSor,...)。函式第乙個引數用來獲取我們外部傳進來乙個字串常量的首位址,這樣,我們可以在仿寫的myprintf內部中遍歷這個字串常量時,就能知道我們究竟要列印何種型別,比如傳進來「%d %s %d」,就知道,我們應該列印乙個整數,乙個空格,乙個字串,乙個空格,乙個整數。

函式的第二個引數...叫形參省略符這樣,系統能不判斷傳進來的引數,而是自動根據我們寫的引數從右至左依次幫我們入棧即可。

比如我這樣呼叫 myprintf( 「%d %s %d」,nNumone,szBuf,nNumtwo )。引數從右至左依次入棧,先入 nNumtwo(具體數值), szBuf(待列印字串首位址), nNumone(具體數值)。最後再入第乙個引數的位址,也就是 「%d %s %d」這個字串的首位址。

具體解析myprintf函式實現過程,int** pTem = (int **)&pSor, pTem++。這樣, pTem就指向第二個引數去了,再加加。就指向第三個引數去了。

依次類推。然後我們再定義乙個char *pDes = pSor,這樣我們就可以通過while(·\0· != * pDes ),內部偏移 pDes指標,以達到獲取 「%d %s %d」具體資訊的目的。

這樣,整個函式的基本雛形就出來了。好吧好吧,有點累了,明天醒來時有空再插圖跟進,先去睡會,。

c語言printf後面的 表示什麼意思誰能解釋一下,為啥不輸出前面5個字元?

Cyan printf 利用指向字串第乙個字元的指標 數值為位址的變數 來標識它所要列印的字串,printf的引數一般是陣列名,指標變數或引號中的字串,這些傳遞的都是第乙個字元的位址。是位址運算子,當 的後面跟乙個變數名時,給出這個變數的位址,例如 name表示變數name的位址。題主的問題中,na...

怎麼理解 C 語言是面向過程的語言,C 是物件導向的語言?

真正面向過程的語言是BASIC之類,C語言已經是物件導向的語言了,我目前從事物聯網軟體開發工作,主要程式語言是C,基本上是用物件導向的手法進行開發,沒什麼不同。而C 更複雜了,它既可以寫面向過程,也可以物件導向,還可以泛型手法,甚至函式式。 Surface 這兩天我明白了題主所說的問題,我說下我的理...

編譯器如何處理 printf 這種語言自帶的函式?

豆芽 語言其實是個規範。如果要讓使用某個語言開發的程式要跑起來,除了編譯器,還得有工程技術支援,和語言擴充套件 庫 工程技術,比如程式執行時支援 程序載入技術 os介面對接等等 從題主的描述來講,我懷疑題主書都沒看就上來問問題。首先,printf不是語言自帶的函式。然後在parser之後的過程中,在...