音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
千萬(wàn)別用sprintf
試試這段代碼
#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
我從來(lái)不用printf,太占ROM資源了。
MCU系統(tǒng)中,盡量少用庫(kù)函數(shù)為秒~~~~能自己寫(xiě)就自己寫(xiě)吧。

3樓: >>參與討論
IceAge
不怪編譯器, 是你自己沒(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
謝謝關(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
可能是我弄錯(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
我暈~~~真不知道有幾個(gè)人這樣用sprintf()
 
7樓: >>參與討論
王紫豪
除非mcu實(shí)在放不下了,我就用sprintf,不用白不用
 
8樓: >>參與討論
王紫豪
一般編譯器不會(huì)犯這樣的低級(jí)錯(cuò)誤的
常量的話直接放在“”里就是了,變量的話就把類(lèi)型寫(xiě)對(duì),自己聲明的變量,總弄不錯(cuò)把,嘿嘿!

9樓: >>參與討論
yanfengzhu
同意樓上,不用白不用。
呵呵!
不過(guò)除非做lcd菜單,用sprintf比較少,用得多得是printf,用來(lái)調(diào)試程序。
我曾經(jīng)也自己寫(xiě)過(guò)這兩個(gè)程序,但是要實(shí)現(xiàn)全部的功能確實(shí)要花很多rom,簡(jiǎn)化版又沒(méi)有庫(kù)好用。

參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
運(yùn)放能放大1000倍嗎?可不可靠?
定時(shí)器做1秒延遲成功了,可是數(shù)碼管顯示不一樣
c調(diào)匯編與大家共享,雜散資料總匯
LED循環(huán)亮的問(wèn)題(取表方式)
對(duì)遙控器設(shè)置密碼怎么寫(xiě)程序?
免費(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)