![]() |
應該強制轉(zhuǎn)換一下類型,自動補齊小數(shù)點后面的。 |
就是壓棧位數(shù)的問題,默認當int兩個字節(jié),float是4個字節(jié)的。 默認位數(shù)跟編譯器關系很大,c51,gcc,vc都不一樣。 C51的double和float都是4字節(jié)的,別的地方可不一樣,要小心。 感覺換成sprintf(s, "%.2f", (float)i);在更多的平臺上通用 |
sprintf的作用是將一個格式化的字符串輸出到一個目的字符串中,而printf是將一個格式化的字符串輸出到屏幕。sprintf的第一個參數(shù)應該是目的字符串,如果不指定這個參數(shù),執(zhí)行過程中出現(xiàn) "該程序產(chǎn)生非法操作,即將被關閉...."的提示。 因為C語言在進行字符串操作時不檢查字符串的空間是否夠大,所以可能會出現(xiàn)數(shù)組越界而導致程序崩潰的問題。即使碰巧,程序沒有出錯,也不要這么用,因為早晚會出錯。所以一定要在調(diào)用sprintf之前分配足夠大的空間給buf。 int i = 100; sprintf(s, "%.2f", i); 會打出什么東東來?“100.00”?對嗎?自己試試就知道了 第一個打出來的肯定不是正確結(jié)果,原因跟前面提到的一樣,參數(shù)壓棧時調(diào)用者并不知道跟i 相對應的格式控制符是個”%f”。而函數(shù)執(zhí)行時函數(shù)本身則并不知道當年被壓入棧里的是個整數(shù), 于是可憐的保存整數(shù)i 的那4 個字節(jié)就被不由分說地強行作為浮點數(shù)格式來解釋了,整個亂套了。 試試下面這個: sprintf(s, "%.2f", (double)i); |
參與人數(shù) 1 | 黑幣 +100 | 收起 理由 |
---|---|---|
![]() | + 100 | 回帖助人的獎勵! |
sprintf的作用是將一個格式化的字符串輸出到一個目的字符串中,sprintf的第一個參數(shù)應該是目的字符串,如果不指定這個參數(shù),執(zhí)行過程中出現(xiàn) "該程序產(chǎn)生非法操作,即將被關閉...."的提示。 因為C語言在進行字符串操作時不檢查字符串的空間是否夠大,所以可能會出現(xiàn)數(shù)組越界而導致程序崩潰的問題。即使碰巧,程序沒有出錯,也不要這么用,因為早晚會出錯。所以一定要在調(diào)用sprintf之前分配足夠大的空間給buf。int i = 100; sprintf(s, "%.2f", i); 會打出什么東東來?“100.00”?對嗎?自己試試就知道了,第一個打出來的肯定不是正確結(jié)果,原因跟前面提到的一樣,參數(shù)壓棧時調(diào)用者并不知道跟i 相對應的格式控制符是個”%f”。而函數(shù)執(zhí)行時函數(shù)本身則并不知道當年被壓入棧里的是個整數(shù), 于是可憐的保存整數(shù)i 的那4 個字節(jié)就被不由分說地強行作為浮點數(shù)格式來解釋了,整個亂套了。試試 sprintf(s, "%.2f", (double)i); |
要么在第一個sprintf之后清空str里的內(nèi)容,要么就再定義一個字符串來存儲。不然第一個都沒有意義。 還有,什么叫程序卡在這了。。。。 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎勵! |
我印象中好像不能這樣寫的,sprintf(str,"%d",sw);這里的str代表的是str[80]的首地址,兩個不同數(shù)據(jù)類型的數(shù)據(jù)數(shù)組str的首地址開始存儲,這樣寫好像會引起段錯誤的,最好另外定義多一個數(shù)組;還有就是你第一個最好強制類型轉(zhuǎn)換一下, |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎勵! |
Powered by 單片機教程網(wǎng)