c - s(n)printf 打印比格式说明符指定的字符更多的字符

标签 c embedded stdio

我遇到了一个奇怪的问题 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

…<br/> 2 2 00 00<br/> 4 4 FFFC FF<br/> 4 4 FFFF FF<br/> 4 4 FFFF FF<br/> 2 2 48 48<br/> 4 4 FFA5 FF<br/> 2 2 33 33<br/> 2 2 51 51

我是否忽略了这里的某些内容,或者这可能是与 s(n)printf 的实现相关的特定于平台的问题?

最佳答案

我猜您的实现使用的是signed 字符。 "%X" 格式需要无符号 值。强制转换或使用 unsigned char

/* cast */
int printedS = sprintf(asciiCharsS, "%02X", (unsigned char)pduChars[i]);
int printedSN = snprintf(asciiCharsSN, 3, "%02X", (unsigned char)pduChars[i]);

/* use unsigned char */
unsigned char *pduChars = malloc(17); /* cast is, at best, redundant */
                                      /* sizeof (char) is, by definition, 1 */

关于c - s(n)printf 打印比格式说明符指定的字符更多的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15201904/

相关文章:

C:最近的最大数组值

c - 大括号内的代码行

C函数指针赋值

c - 程序未读取 fgets() 中定义长度的字符串

C 中 printf 函数的代码

c - 为什么此代码不适用于 [100] 及以上? (C 中的欧拉项目 2)

c - 为什么 printf( "%c", 1) 返回笑脸而不是 1 的编码字符

c - 在嵌入式 C 中查找最接近给定值的多维数组中的值

c - 在嵌入式板上使用 uIP 库的基本 hello world 程序

c - C 中自动 stdout 缓冲区刷新的规则是什么?