|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
千萬(wàn)別用sprintf |
| 作者:wdp0 欄目:單片機(jī) |
試試這段代碼 #include <stdio.h> #include <string.h> main() { CHAR acBuf[10]; memset(acBuf, 0, sizeof acBuf); sprintf(acBuf, "%d", 1); } 你會(huì)驚奇的發(fā)現(xiàn):acBuf里面的內(nèi)容時(shí)"256" 我的uVision是正版的,版本信息如下: IDE-Version: 礦ision3 V3.30a COPYRIGHT (c) Keil Elektronik GmbH / Keil SOFTWARE, Inc. 1995 - 2006 License Information: Daping Wang Risecomm LIC=D0MHZ-JWSX9-L3WMB-02PKW-14VUR-YFSX5 Tool Version Numbers: Toolchain Path: C:\Keil\C51\BIN\ C Compiler: C51.Exe V8.02 Assembler: A51.Exe V8.00 Linker/Locator: BL51.Exe V6.00 Librarian: LIB51.Exe V4.24 Hex Converter: OH51.Exe V2.6 CPU DLL: S8051.DLL V3.03 DIALOG DLL: DP51.DLL V2.47 Target DLL: BIN\MON51.DLL V2.40 DIALOG DLL: TP51.DLL V2.47 可能其它的情況下是可以用的,但鑒于這個(gè)bug還是不要用sprintf的好。除非你把所有用到sprintf的情況都測(cè)試過(guò) |
| 2樓: | >>參與討論 |
| 作者: computer00 于 2006/7/27 17:16:00 發(fā)布:
我從來(lái)不用printf,太占ROM資源了。 MCU系統(tǒng)中,盡量少用庫(kù)函數(shù)為秒~~~~能自己寫(xiě)就自己寫(xiě)吧。 |
|
| 3樓: | >>參與討論 |
| 作者: IceAge 于 2006/7/27 20:28:00 發(fā)布:
不怪編譯器, 是你自己沒(méi)有理解好 sprintf 編譯器不檢查 sprintf 這類(lèi)可變參數(shù)的數(shù)據(jù)類(lèi)型,就是說(shuō) **你** 必須保證參數(shù)類(lèi)型與 format 字串中的類(lèi)型相匹配。 sprintf(acBuf, "%d", 1) 中的 1 可以是 CHAR, SHORT, LONG,甚至是地址, 顯然這里被默認(rèn)作了 CHAR, 而 %d 要求int 類(lèi)型,所以出現(xiàn)了不可預(yù)知的結(jié)果。 |
|
| 4樓: | >>參與討論 |
| 作者: wdp0 于 2006/7/29 0:53:00 發(fā)布:
謝謝關(guān)注,繼續(xù)討論 to IceAge: 這個(gè)問(wèn)題我試驗(yàn)過(guò),你可以把1換成一個(gè)int型的數(shù)試試看。 另外,我個(gè)人覺(jué)得如果ansi c的編譯器出來(lái)的結(jié)果應(yīng)該給c51出來(lái)的結(jié)果一樣。 如果不一樣,我就認(rèn)為c51的編譯器有bug sprintf(acBuf, "%d", 1)這句話,我在vc6.0里面的結(jié)果是正常的。vc6.0的編譯器是符合ansi c標(biāo)準(zhǔn)的。 to computer00: 當(dāng)然如果是只用到了很少方面的功能,自己寫(xiě)是不錯(cuò)的,而且節(jié)省很多rom. 如果自己把sprintf的所有功能都實(shí)現(xiàn),太多代碼了。而且效率可能還不如別人寫(xiě)好的。 |
|
| 5樓: | >>參與討論 |
| 作者: wdp0 于 2006/7/29 1:12:00 發(fā)布:
可能是我弄錯(cuò)了 to IceAge: 剛剛又用 int i = 1; sprintf(acBuf, "%d", i); 試驗(yàn)了一次,是可以的。 上次可能是這樣調(diào)試的之前沒(méi)有"rebuild all",所以才會(huì)提這個(gè)問(wèn)題出來(lái)。 現(xiàn)在揭帖 謝謝支持 |
|
| 6樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/29 1:13:00 發(fā)布:
我暈~~~真不知道有幾個(gè)人這樣用sprintf() |
|
| 7樓: | >>參與討論 |
| 作者: 王紫豪 于 2006/7/29 9:45:00 發(fā)布:
除非mcu實(shí)在放不下了,我就用sprintf,不用白不用 |
|
| 8樓: | >>參與討論 |
| 作者: 王紫豪 于 2006/7/29 9:47:00 發(fā)布:
一般編譯器不會(huì)犯這樣的低級(jí)錯(cuò)誤的 常量的話直接放在“”里就是了,變量的話就把類(lèi)型寫(xiě)對(duì),自己聲明的變量,總弄不錯(cuò)把,嘿嘿! |
|
| 9樓: | >>參與討論 |
| 作者: yanfengzhu 于 2006/7/29 11:45:00 發(fā)布:
同意樓上,不用白不用。 呵呵! 不過(guò)除非做lcd菜單,用sprintf比較少,用得多得是printf,用來(lái)調(diào)試程序。 我曾經(jīng)也自己寫(xiě)過(guò)這兩個(gè)程序,但是要實(shí)現(xiàn)全部的功能確實(shí)要花很多rom,簡(jiǎn)化版又沒(méi)有庫(kù)好用。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |