Windows中的printf、sprintf….總結

來源:互聯網
上載者:User

在Windows中使用printf 有文字模式、命令列C語言程式寫作曆史的程式寫作者往往特別喜歡printf函數。即使可以使用更簡單的命令(例如puts),但printf出現在Kernighan和Ritchie的「hello, world」程式中一點也不會令人驚奇。我們知道,增強後的「hello, world」最終還是需要printf的格式化輸出,因此我們最好從頭開始就使用它。 但有個壞訊息:在Windows程式中不能使用printf。雖然Windows程式中可以使用大多數C的執行時期連結庫-實際上,許多程式寫作者更願意使用C記憶體管理和檔案I/O函數而不是Windows中等效的函數-Windows對標準輸入和標準輸出沒有概念。在Windows程式中可使用fprintf,而不是printf。 還有一個好訊息,那就是仍然可以使用sprintf及sprintf系列中的其它函數來顯示文字。這些函數除了將內容格式化輸出到函數第一個參數所提供的字串緩衝區以外,其功能與printfI相同。然後便可對該字串進行操作(例如將其傳給MessageBox)。 如果您從未使用過sprintf (我第一次開始寫Windows程式時也沒用過此函數),這裡有一個簡短的執行實體,printf函數說明如下: int printf (const char * szFormat, ...) ; 第一個參數是一個格式字串,後面是與格式字串中的代碼相對應的不同類型多個參數。 sprintf函數定義如下: int sprintf (char * szBuffer, const char * szFormat, ...) ; 第一個參數是字元緩衝區;後面是一個格式字串。Sprintf不是將格式化結果標準輸出,而是將其存入szBuffer。該函數返回該字串的長度。在文字模式程式設計中, printf ("The sum of %i and %i is %i", 5, 3, 5+3) ; 的功能相同於 char szBuffer [100] ; sprintf (szBuffer, "The sum of %i and %i is %i", 5, 3, 5+3) ; puts (szBuffer) ; 在Windows中,使用MessageBox顯示結果優於puts。 幾乎每個人都經曆過,當格式字串與被格式化的變數不合時,可能使printf執行錯誤並可能造成程式當掉。使用sprintf時,您不但要擔心這些,而且還有一個新的負擔:您定義的字串緩衝區必須足夠大以存放結果。Microsoft專用函數_snprintf解決了這一問題,此函數引進了另一個參數,表示以字元計算的緩衝區大小。 vsprintf是sprintf的一個變形,它只有三個參數。vsprintf用於執行有多個參數的自訂函數,類似printf格式。vsprintf的前兩個參數與sprintf相同:一個用於儲存結果的字元緩衝區和一個格式字串。第三個參數是指向格式化參數數組的指標。實際上,該指標指向在堆棧中供函數呼叫的變數。va_list、va_start和va_end宏(在STDARG.H中定義)協助我們處理堆棧指標。本章最後的SCRNSIZE程式展示了使用這些宏的方法。使用vsprintf函數,sprintf函數可以這樣編寫: int sprintf (char * szBuffer, const char * szFormat, ...) { int iReturn ; va_list pArgs ; va_start (pArgs, szFormat) ; iReturn = vsprintf (szBuffer, szFormat, pArgs) ; va_end (pArgs) ; return iReturn ; } va_start宏將pArg設定為指向一個堆棧變數,該變數地址在堆棧參數szFormat的上面。 由於許多Windows早期程式使用了sprintf和vsprintf,最終導致Microsoft向Windows API中增添了兩個相似的函數。Windows的wsprintf和wvsprintf函數在功能上與sprintf和vsprintf相同,但它們不能處理浮點格式。 當然,隨著寬字元的發表,sprintf類型的函數增加許多,使得函數名稱變得極為混亂。表2-1列出了Microsoft的C執行時期連結庫和Windows支援的所有sprintf函數。 表2-1 ASCII 寬字元 常規 參數的變數個數 標準版 sprintf swprintf _stprintf 最大長度版 _snprintf _snwprintf _sntprintf Windows版 wsprintfA wsprintfW wsprintf 參數數組的指標 標準版 vsprintf vswprintf _vstprintf 最大長度版 _vsnprintf _vsnwprintf _vsntprintf Windows版 wvsprintfA wvsprintfW wvsprintf 在寬字元版的sprintf函數中,將字串緩衝區定義為寬字元串。在寬字元版的所有這些函數中,格式字串必須是寬字元串。不過,您必須確保傳遞給這些函數的其它字串也必須由寬字元組成。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.