在嵌入式系統(Libelium Waspmote,類似於Arduino)中,我遇到了一個sprintf
的奇怪問題,sprintf輸出的字符數超過格式說明符給出的字符數。在這個特定的實例中,我使用%02X
來輸出數組中字節的十六進制值。然而,在一些字節中,不是寫入2個字符,而是寫入4個字符,其中FF
在實際字節值之前加前綴。 snprintf
的行爲相似,只是它遵守指定的緩衝區大小並僅打印前綴。s(n)printf打印更多字符而不是格式說明符指定
作爲參考,這裏是代碼片段打印數組內容:
char *pduChars = (char *) malloc(17*sizeof(char));
pduData.toChar(pduChars);
for (int i = 0; i < 17; i++) {
char asciiCharsS[5];
char asciiCharsSN[3];
int printedS = sprintf(asciiCharsS, "%02X", pduChars[i]);
int printedSN = snprintf(asciiCharsSN, 3, "%02X", pduChars[i]);
USB.print(printedS);
USB.print(" ");
USB.print(printedSN);
USB.print(" ");
USB.print(asciiCharsS);
USB.print(" ");
USB.print(asciiCharsSN);
USB.println(" ");
}
,並從該段(刪節僅將錯誤字節)的輸出: 實際字節序列應爲0x00 0xFC有0xFF的0xFF的0x48 0xA5和0x33 0x51
sprintf snprintf sprintf Buffer snprintf Buffer
…
2 2 00 00
4 4 FFFC FF
4 4 FFFF FF
4 4 FFFF FF
2 2 48 48
4 4 FFA5 FF
2 2 33 33
2 2 51 51
我在這裏忽略了一些東西,或者這可能是與執行s(n)printf
有關的平臺特定問題?
難道在你的平臺上'char'是2個字節?請注意,'%02X'中的2是最小長度,而不是最大長度。 – Shahbaz 2013-03-04 12:48:12
'sizeof(char)'返回'1',所以它似乎並非如此。 – 2013-03-04 13:01:26
'sizeof(char)'總是一個。這是由標準定義的。但這並不意味着它是一個字節。實際上,'sizeof'沒有給出字節數,它顯示了相對於'char'大小的大小。 – Shahbaz 2013-03-04 13:09:27