Срещам любопитен проблем с sprintf
на вградена система (Libelium Waspmote, подобна на Arduino), където sprintf извежда повече знаци, отколкото е дадено от спецификатора на формата. В този конкретен случай използвам %02X
за извеждане на шестнадесетичната стойност на байтовете в масив. В някои байтове обаче, вместо да се пишат 2 знака, се записват 4, като FF
се поставя пред действителната стойност на байта. snprintf
се държи по подобен начин, с изключение на това, че зачита определения размер на буфера и просто отпечатва префикса.
За справка, тук е кодовият фрагмент, отпечатващ съдържанието на масива:
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 байта? Обърнете внимание, че 2 в%02X
е минималната, а не максималната дължина. - person Shahbaz   schedule 04.03.2013sizeof(char)
връща1
, така че изглежда, че не е така. - person Seán Labastille   schedule 04.03.2013sizeof(char)
винаги е едно. Това е определено от стандарта. Но това не означава, че е един байт. Всъщностsizeof
не дава броя на байтовете, той показва размера спрямо размера наchar
. - person Shahbaz   schedule 04.03.2013free()
паметта, разпределена заpduChars
! - person pmg   schedule 04.03.2013