Я столкнулся с любопытной проблемой с 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