sprintf가 형식 지정자보다 많은 문자를 출력하는 임베디드 시스템 (Arduino와 비슷한 Libelium Waspmote)에서 sprintf
과 관련된 문제가 발생했습니다. 이 특정 인스턴스에서 나는 배열의 바이트의 16 진수 값을 출력하기 위해 %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
'sizeof (char)'는'1'을 반환하므로 그렇지 않다. –
'sizeof (char)'는 항상 하나입니다. 이는 표준에 의해 정의됩니다. 그러나 그것이 1 바이트라는 것을 의미하지는 않습니다. 실제로'sizeof'는 바이트 수를주지 않고'char'의 크기에 비례하여 크기를 보여줍니다. – Shahbaz